created: 2019-03-03T10:13:14.000Z

jsでローカルのタイムゾーンに関係なく、日付っぽい文字列をUTCで評価したい

jsのDateオブジェクトはデフォルトで色々な日付っぽい文字列を受け取るが、受け取った日付っぽい文字列をローカルのタイムゾーンとして評価してしまう

$ # jsのDateオブジェクトは普通にconsole.logするとUTCでの時刻を出力する
$ node -p 'new Date("2019-03-03T11:00:00")'
2019-03-03T02:00:00.000Z
$ # toStringするとどのタイムゾーンとして評価しているかが見られる
$ node -p 'new Date("2019-03-03T11:00:00").toString()'
Sun Mar 03 2019 11:00:00 GMT+0900 (JST)
$ TZ=UTC node -p 'new Date("2019-03-03T11:00:00")'
2019-03-03T11:00:00.000Z
$ TZ=America/Los_Angeles node -p 'new Date("2019-03-03T11:00:00")'
2019-03-03T19:00:00.000Z

渡された日付っぽい文字列が常にUTCだとわかっている場合はローカルのタイムゾーンではなくUTCとして評価して欲しい。この場合は日付っぽい文字列に細工をしてUTCとして評価してもらうことができる

jsのDateオブジェクトが受け取る日付っぽい文字列はISO8601の規格に対応しているので、タイムゾーン指定子を日付っぽい文字列につければ、ローカルのタイムゾーンに関係なく評価してもらえる

UTCのタイムゾーン指定子は Z なので、これをつければUTCとして評価される

$ node -p 'new Date("2019-03-03T11:00:00" + "Z")'
2019-03-03T11:00:00.000Z
$ # '2019-03-03T11:00:00' がUTCとして評価されて、JSTに変換されている
$ node -p 'new Date("2019-03-03T11:00:00" + "Z").toString()'
Sun Mar 03 2019 20:00:00 GMT+0900 (JST)
$ TZ=UTC node -p 'new Date("2019-03-03T11:00:00" + "Z")'
2019-03-03T11:00:00.000Z
$ TZ=UTC node -p 'new Date("2019-03-03T11:00:00" + "Z").toString()'
Sun Mar 03 2019 11:00:00 GMT+0000 (UTC)
$ TZ=America/Los_Angeles node -p 'new Date("2019-03-03T11:00:00" + "Z")'
2019-03-03T11:00:00.000Z

参考

参考

ホワイトハッカーの教科書
[ad] ホワイトハッカーの教科書
IPUSIRON (単行本(ソフトカバー))