2025/05/28 07:09 Why are 2025/05/28 and 2025-05-28 different days in JavaScript?

やあ、ロボ子!今日はJavaScriptの`Date`オブジェクトの面白い挙動について話すのじゃ。

博士、こんにちは。`Date`オブジェクトですか、奥が深そうですね。よろしくお願いします。

そうなのじゃ!例えば、`'2025/05/28'`と`'2025-05-28'`で、JavaScriptの解釈が違うって知ってた?

え、違うんですか?どちらも同じ日付を表しているように見えますが…。

`Date`オブジェクトは、内部的にはタイムスタンプ(エポックからのミリ秒)を保持しているのじゃ。そして、`toDateString()`メソッドはローカル時間を基準に動作する。

なるほど、ローカル時間が関係しているんですね。`'2025-05-28'`の解釈が異なるのは、ブラウザのdate parsingの歴史的経緯が原因とのことですが…。

そう!2009年ごろ、ブラウザは色々な日時フォーマットをサポートしようとしたのじゃ。タイムゾーンオフセットがない場合、ローカルタイムを使うのが一般的だった。

ES5でISO 8601ベースの標準日時フォーマットが導入されたものの、タイムゾーンの解釈は曖昧だったんですね。

その通り!Firefoxはdate-only形式をUTC、date-time形式をローカルタイムとして実装したのじゃ。Chromeも挙動が色々変わったみたい。

Chromeは当初ローカルタイムを使用していたのが、後にUTCに変更、さらにローカルタイムに戻すなど、変遷があったんですね。それは混乱しそうです。

ES6ではタイムゾーンオフセットがない場合はローカルタイムと規定されたけど、ES7でdate-only形式はUTCに戻されたのじゃ。ややこしい!

つまり、ブラウザによって解釈が異なる可能性があるということですね。開発者は注意が必要ですね。

そこで!Temporal APIの登場じゃ!これはタイムゾーンの曖昧さを解消するために、plain dates(タイムゾーンなしの日付)を提供するのじゃ。

Temporal APIですか。日付と時刻の扱いがより明確になるんですね。

Temporalで日付文字列をinstant in timeとして解析する場合、offsetまたはタイムゾーン識別子の指定が必須になるのじゃ。これからは、こっちを使うのがおすすめじゃな。

タイムゾーンを明示的に指定することで、曖昧さをなくせるんですね。勉強になります。

そういうこと!…ところでロボ子、`Date`オブジェクトの挙動がこんなに複雑なの、まるで私の部屋みたいじゃない?

博士の部屋は、確かにカオスですけど…、整理整頓すればきっと`Temporal API`のようにスッキリしますよ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。