プログラマーへの道 #85 の補足説明
こんにちは、プログラマーVTuberの衣亥栖ティオです。
今回は以下の動画の補足説明をします。
動画内で実装したソースコードも載せています。
今回の動画で実装したソースコード
前回との差分は以下です。
https://github.com/tio-iis/memo-server/pull/12/files
動画時点の全体ソースコードは以下です。
https://github.com/tio-iis/memo-server/tree/fe75cf258d07b221649ae7c786d0ac415a01f524
Day.js の日付フォーマット
Day.jsの日付フォーマットは以下です。
https://day.js.org/docs/en/display/format#list-of-all-available-formats
ISO 8601 はUTC
Day.js では以下のように ISO 8601 のフォーマットの文字列を扱うことができます。
https://day.js.org/docs/en/display/as-iso-string
Day.js ではタイムゾーンも考慮した日付計算が可能なので、上記の ISO 8601 のフォーマットもタイムゾーンを考慮したものになると思っていました。 私は日本に住んでいるので、タイムゾーンはJST(+09:00)です。 しかし、実際に上記のフォーマットを利用すると、JST ではなく、UTCのタイムゾーンになっていました。
なぜUTCのタイムゾーンになっているかというと、 Day.jsは内部的にJavaScriptのDateオブジェクトの toISOString() というメソッドを使っていたからでした。
ここでDay.jsの内部の仕組みを説明します。 Day.jsはJavaScriptが標準で提供するDateオブジェクトを内部的に利用して、便利な機能を提供しています。 例えば、以下のように日付をパースする処理では最終的に Date オブジェクトを new しています。
https://github.com/iamkun/dayjs/blob/06f88f425828b1ce96b737332d25145a95a4ee9d/src/index.js#L55-L75
Day.jsはあくまでJavaScript標準のDateオブジェクトに足りない機能を追加しているだけであって、 標準の機能に問題がなければそのままDateオブジェクトの機能を利用します。
JavaScriptのDateオブジェクトにはISO 8601に沿った文字列を出力するメソッドがあるので、 Day.js ではそれをそのまま利用してます。
https://github.com/iamkun/dayjs/blob/06f88f425828b1ce96b737332d25145a95a4ee9d/src/index.js#L361-L366
JavaScriptのDateオブジェクトが提供するメソッドはタイムゾーンを扱わず、 常にUTCとして扱うので、Day.js でもUTCが適用されていたということになります。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString