0%

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

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'