導入
Web開発において、日時の計算は最もバグが混入しやすい領域の一つです。特に「1日は必ず24時間である」という前提でコードを書いていると、サマータイム(夏時間)が導入されている地域を扱う際に、時間のズレや計算ミスが発生します。今回紹介するTemporal.ZonedDateTime.prototype.hoursInDayは、特定のタイムゾーンにおけるその日の正確な時間数を取得するための強力なツールです。これを使うことで、複雑なオフセット変更を考慮した堅牢なスケジュール機能を実装できるようになります。
基礎知識
Temporal APIは、従来のDateオブジェクトが抱えていた「タイムゾーンの扱いにくい」「不変性がない」といった問題を解決するために策定された新しいJavaScript標準です。その中でもZonedDateTimeは、タイムゾーン情報を保持できるクラスです。
通常、1日は24時間ですが、サマータイムの切り替え日には24時間ではなく、23時間(時計が進む)や25時間(時計が戻る)になる日が存在します。hoursInDayプロパティは、対象の日付がそのタイムゾーンにおいて「実際に何時間あるか」を正の整数で返します。
実装/解決策
このプロパティは、特定のZonedDateTimeインスタンスに対して呼び出すだけで利用可能です。例えば、サマータイムの切り替えが発生する日付を指定して、その日が24時間かを判定し、必要であれば警告を出したり、計算ロジックを分岐させたりといった処理に役立ちます。
サンプルプログラム
以下のコードは、指定したタイムゾーンにおいて、その日が24時間かどうかを判定する実用的なスニペットです。
// 特定のタイムゾーンでの日時を生成
const zdt = Temporal.ZonedDateTime.from('2024-03-31T00:00:00[Europe/London]');
// その日の実際の時間数を取得
const hours = zdt.hoursInDay;
if (hours !== 24) {
console.log(`警告: この日はサマータイム調整のため、${hours}時間です。`);
} else {
console.log('この日は通常の24時間です。');
}
// 応用: その日の終了時刻を正確に計算する際などに利用可能
console.log(`その日の合計時間数: ${hours}時間`);
応用・注意点
注意点として、本記事執筆時点ではTemporal APIは比較的新しい機能であり、すべてのブラウザで標準サポートされているわけではありません。実務で導入する場合は、必ずポリフィル(polyfill)を導入するか、ターゲットブラウザの対応状況を十分に確認してください。
また、hoursInDayは「読み取り専用」です。この値を直接書き換えて時間を操作することはできません。時間の加算・減算を行いたい場合は、add()やsubtract()メソッドを併用し、Temporalの不変性を維持した設計を心がけましょう。現場でよくあるミスとして、このプロパティの結果を単純に「24」で割って日数を計算しようとすると、サマータイムの境界で誤差が出ます。日単位の計算には、必ずTemporalが提供する日付計算メソッドを活用してください。

コメント