ISO 8601のUTCタイムゾーンでtimestampが保存されたMongoDBがあります。レンジクエリを書くときにISO 8601で引数を渡していますが、UNIXタイムスタンプを使ってクエリできないか調べました。Moment.jsを使うといろいろな表記の日付をパースしたりフォーマットすることができます。
テスト用のDockerコンテナ
Dockerイメージをビルドするプロジェクトを作成します。
$ mkdir -p ~/node_apps/moment-spike
$ cd !$
{
"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'