date-fns/tzを触ってみた
はじめに
date-fns
のv4.0でタイムゾーンがサポートされました。
今までdate-fns
を導入したプロジェクトでタイムゾーンを考慮した日時を扱う場合は、外部パッケージのdate-fns-tzと組み合わせて実装していましたが、今回のアップデートでdate-fns/tzという新しいパッケージとして使用できるようになりました。
この記事では、時刻表記に関する知識と、それを踏まえたdata-fns/tz
の使い方を見ていきます。
時刻表記について
JavaScriptのDate()
コンストラクタの引数のうち、日付文字列の形式はISO8601で定められています。date-fns/tz
のREADMEでもこの日付文字列が使われているため、ここではISO 8601形式がどのようなものなのかおさらいしておきます。
Time zone | ISO 8601形式 |
---|---|
日本標準時(JST) | 2024-09-27T13:50:40+09:00 |
協定世界時(UTC) | 2024-09-27T04:50:40Z |
- 「年、月、日」は
-
(ハイフン) で区切る。 - 「時、分、秒」は
:
(コロン)で区切る。 - 「日付」と「時間」の区切りに
T
を用いる。 -
協定世界時(UTC)
の場合は末尾にZ
記号をつける。 - UTCより先に進んでいる時間帯の場合は
+
、UTCより後に遅れている時間帯の場合は-
として、時刻の後ろに±hh:mm
,±hhmm
,±hh
のいずれかを添える
date-fns/tzの使い方
インストール
$ npm install @date-fns/tz --save
よく使いそうなものに絞って紹介します。
TZDate
TZDate()
はDate()
に似たAPIを持ちますが、日時の計算を指定されたタイムゾーンで行います。
TZDate()
コンストラクタの引数は末尾の引数以外はDate()
コンストラクタの引数と同じです。
new TZDate(2022, 2, "Asia/Singapore");
new TZDate(timestamp, "Asia/Singapore");
new TZDate("2024-09-12T00:00:00Z", "Asia/Singapore");
DST(サマータイム)も計算してくれるようです。
import { TZDate } from "@date-fns/tz";
import { addHours } from "date-fns";
// 実行環境のタイムゾーンが America/Los_Angeles だと想定します。
// DST(サマータイム)中の 2022年3月13日 日曜日 02:00:00 の時間を扱います。
// 実行環境のタイムゾーンに基づき、DST(サマータイム)が計算されて 02:00 ではなく 03:00 が出力されます。
const date = new Date(2022, 2, 13);
addHours(date, 2).toString();
//=> 'Sun Mar 13 2022 03:00:00 GMT-0700 (Pacific Daylight Time)'
// タイムゾーンを Asia/Singapore に指定すると、DST(サマータイム)はないので 02:00 が出力されます。
const tzDate = new TZDate(2022, 2, 13, "Asia/Singapore");
addHours(tzDate, 2).toString();
//=> 'Sun Mar 13 2022 02:00:00 GMT+0800 (Singapore Standard Time)'
withTimeZone
指定したタイムゾーンで新たにTZDate
インスタンスを作成できます。
const sg = new TZDate(2022, 2, 13, "Asia/Singapore");
const ny = sg.withTimeZone("America/New_York");
sg.toString();
//=> 'Sun Mar 13 2022 00:00:00 GMT+0800 (Singapore Standard Time)'
ny.toString();
//=> 'Sat Mar 12 2022 11:00:00 GMT-0500 (Eastern Standard Time)'
tz
date-fns
の関数にタイムゾーンのコンテキストを指定できます。
import { isSameDay } from "date-fns";
import { tz } from "@date-fns/tz";
isSameDay("2024-09-09T23:00:00-04:00", "2024-09-10T10:00:00+08:00", {
in: tz("Europe/Prague"),
});
//=> true
上記のin
オプションはdate-fns
のv4.0以降でしか使用できません。
isSameDay()
だけでなく、date-fns
のv4.0以降、あらゆる関数にタイムゾーンを指定するオプションが追加されているようです。
まとめ
今回の記事では、date-fns
のv4.0で新たに追加されたタイムゾーンサポートと、date-fns/tz
パッケージの基本的な使い方について解説しました。
date-fns
はv5.0に向けてTemporal APIへの対応も視野に入れており、今後のアップデートにも注目ですね。
ちょっと株式会社(chot-inc.com)のエンジニアブログです。 フロントエンドエンジニア募集中! カジュアル面接申し込みはこちらから chot-inc.com/recruit/iuj62owig
Discussion