プログラマー VTuber 衣亥栖ティオのちょっとした話

Youtubeに投稿したプログラミング学習動画の補足説明をするためのブログです。

プログラマーへの道 #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