はじめに
FireStoreのTimestampクラスでフィールドにDateオブジェクト渡すと取得時にTimestampクラスが返ってきますが、ここの経過時間の取得でハマった(というか勘違い)したことがあったので、サクッと振り返ります。
※個人ブログから技術的アウトプットはQiitaへ引っ越ししたので、こちらは過去に書いたブログとなります。
Dateとは
- 簡単にいうと日時を取得。ミリ秒単位
- ミリ秒とは? :1秒 = 1000ミリ秒
そう、冒頭のここ。
JavaScript の日時は、基本的に協定世界時 (UTC) の1970年1月1日深夜0時からの経過ミリ秒数で指定されます。
なんで強調しているかというと、ここでハマった。
というか知らずに秒と勘違いしてた。
publicationDate: new Date(episode.publicationDate.seconds).toISOString()
結果...
> "publicationDate": "1970-01-19T08:01:21.660Z"
と、1970年の値が返ってきて意図していない経過時間が返ってきている。
ちなみにこの数字は
publicationDate: new Date(episode.publicationDate.seconds).toISOString(),
console.log('episode.publicationDate.secondsは? : ', episode.publicationDate.seconds)
> episode.publicationDate.secondsは? : 1584081660
と、 1970年1月1日深夜0時から1584081660秒(約19日分)経過した時間。
解決策
ミリ秒に変換
- Timestampクラス
// ミリ秒に変換
Timestamp.toMillis()
もしくは求められた秒数に1000を掛けるとミリ秒数が返ってくる。
publicationDate: new Date(episode.publicationDate.seconds * 1000).toISOString()
結果...
> "publicationDate": "2020-03-13T06:41:00.000Z"
取得したい経過時間がとれた。
その他、Timestampクラスメソッドは...
// Dateに変換
Timestamp.toDate()
など他にもある。
Timestamp | JavaScript SDK | Firebase
まとめ
- JavaScriptのDateオブジェクトは基本的に協定世界時 (UTC) の1970年1月1日深夜0時からの経過ミリ秒数で指定。
- FirestoreのTimestampクラスでミリ秒に変換する場合、Timestamp.toMillis()で取得可能。もしくは求められた秒数に1000を掛けるとミリ秒数を求めることができる。