Node.js
MongoDB
moment.js
ISO8601

Moment.jsを使ってUNIXタイムスタンプをISO 8601表記に変換する

More than 3 years have passed since last update.

ISO 8601のUTCタイムゾーンでtimestampが保存されたMongoDBがあります。レンジクエリを書くときにISO 8601で引数を渡していますが、UNIXタイムスタンプを使ってクエリできないか調べました。Moment.jsを使うといろいろな表記の日付をパースしたりフォーマットすることができます。


テスト用のDockerコンテナ

Dockerイメージをビルドするプロジェクトを作成します。

$ mkdir -p ~/node_apps/moment-spike

$ cd !$


~/node_apps/moment-spike/package.json

{

"name": "moment-spike",
"version": "0.0.1",
"private": true,
"dependencies": {
"moment": "~2.8.1"
},
"scripts": {"start": "node"}
}

Dockerfileを作成してイメージをビルドします。ベースイメージはgoogle/nodejs-runtimeを使います。

$ echo FROM google/nodejs-runtime > Dockerfile

$ docker pull google/nodejs-runtime
$ docker build -t moment-spike .


使い方

使い捨てのDockerコンテナを起動します。

$ docker run --rm -it moment-spike 

> moment-spike@0.0.1 start /app
> node

>


moment(timestamp * 1000)

UNIXタイムスタンプの作成はmoment().unix()を使います。

> var moment = require('moment')

undefined
> start = moment().unix()
1428393579

UNIXタイムスタンプをフォーマットするときはXを指定します。単位が秒のまま引数に渡すとパースできません。

> moment(start).format()

'1970-01-17T12:46:33+00:00'
> moment(start,'X').format();
'2015-04-07T07:59:39+00:00'

Unix Offset (milliseconds)にあるように、moment(Number);のNumberはJavaScriptのnew Date(Number)と同様にミリ秒です。moment(timestamp * 1000)のように1000倍にしてもパースできます。

> moment(start*1000).format()

'2015-04-07T07:59:39+00:00'


ISO 8601表記にする

Moment.jsで作成した日付をISO 8601表記にする場合はDate.prototype.toISOString関数を使います。

> moment(start*1000).toISOString();

'2015-04-07T07:59:39.000Z'