Old Sunset Days

Node.jsでUnix timeデータを扱う

日付 タグ node.js カテゴリ node.js

目次

DateとUnix timeの相互変換

この前、MongoDBをNode.jsから扱う記事を書いたが、データが生成された時の時刻を保存しようと思った時に、Unix timeで保存しておきたいなと考えたが、そもそもどうやってUnix timeをNode.jsで取得できるのかわからなかったので、調べたことのメモ書き的な記事である。

https://ja.wikipedia.org/wiki/UNIX%E6%99%82%E9%96%93 - UNIX時間

UNIX timeとはUTC(協定世界時 )で1970年1月1日午前0時0分0秒からの経過秒数で日時や時刻を表したものである。

Macであれば、コマンドラインで現在の日時は

$ date
2020年 12月 3日 木曜日 21時54分21秒 JST

のように取得できるが、これをUnix timeで時刻を取得するには

$ date +%s
1607000063

のようにパラメーターを与えればUnix timeが取得できる。
では、Node.jsではどのようにすればUnix timeを取得できるのだろうか。

Dateを取得してUnix timeに変換

Node.jsでUnix timeを取得するには一旦Dateで取得したものを変換すれば良い。

例えば、

var date = new Date();

で現在日時が取得できるが、ここで得られたdateに対して.getTime()でミリ秒まで考慮したUnix timeが取得できる。

var unixTimestamp = date.getTime()

ただ、一般的なUnix timeと言えば、秒の単位までのケースが多いので、その意味ならば、

var unixTimestamp = Math.floor(date.getTime() / 1000 );

のように計算すれば秒単位までのUnix timeが得られる。

これをNode.jsのREPL(対話インタプリタ)を起動してテストしてみたのが以下。

まずはミリ秒単位まで。

$ node
Welcome to Node.js v14.13.0.
Type ".help" for more information.
> var date = new Date()
undefined
> date
2020-12-03T13:14:35.372Z
> var unixTimestamp = date.getTime()
undefined
> unixTimestamp
1607001275372
> var dateRevert = new Date(1607001275372)
undefined
> dateRevert
2020-12-03T13:14:35.372Z
> .exit

一旦Unix timeに変換したものをnew Date(Unix time)で再び元の時刻に戻せているのが確認できる。

一方、秒単位に一度端折って計算してしまうと、

$ node
Welcome to Node.js v14.13.0.
Type ".help" for more information.
> var date = new Date()
undefined
> date
2020-12-03T13:17:32.346Z
> var unixTimestamp = Math.floor(date.getTime() / 1000 );
undefined
> unixTimestamp
1607001452
> var dateRevert = new Date(1607001452*1000)
undefined
> dateRevert
2020-12-03T13:17:32.000Z
> .exit

元のDateに戻す時に1000倍で戻しても、もとのDateで取得した時刻には戻らず微妙な誤差は出る。 まあ、ミリ秒単位から一度秒単位にしているので当然と言えば当然ではあるが。

ミリ秒までもともとのDateで取得できているのなら、MongoDBに保存する時のtimestampにはミリ秒単位まで含むUnix timeでいいだろう。