😢

rruleが返す日付のタイムゾーンの扱いでハマったメモ

2023/04/01に公開

rrule ( https://github.com/jakubroztocil/rrule ) を使っていてとてもハマったところがあったのでメモしておく。

このライブラリ(rrule)はタイムゾーンの扱いについてちょっと独特な仕様がある。
下記のコードを見てほしい。

// https://github.com/jakubroztocil/rrule#timezone-support

new RRule({
  dtstart: datetime(2018, 2, 1, 10, 30),
  count: 1,
  tzid: 'Asia/Tokyo',
}).all()[
  // assuming the system timezone is set to America/Los_Angeles, you get:
  '2018-01-31T17:30:00.000Z'
]
// which is the time in Los Angeles when it's 2018-02-01T10:30:00 in Tokyo.

システムのタイムゾーンがAmerica/Los_angelesに設定されたマシンで東京時間の2018年2月1日10時30分開始のイベントを作る。

ここで、東京時間の 2018年2月1日10時30分をUTC時刻にした '2018-02-01T01:30:00.000Z' を返してほしい。しかしこれは '2018-01-31T17:30:00.000Z' を返す。
どういうことかというと、返されるUTC時刻は、常にローカル時間として解釈してほしい、ということらしい。

THE BOTTOM LINE: Returned "UTC" dates are always meant to be interpreted as dates in your local timezone. This may mean you have to do additional conversion to get the "correct" local time with offset applied.
https://github.com/jakubroztocil/rrule#important-use-utc-dates

つまり、UTC時間の2018年1月31日17時30分が返されるけど、UTC時間だということは無視してロサンゼルス時間として計算してね!ということで、ロサンゼルス時間の17時30分は東京時間で翌日の10時30分なのでこれは正しい結果だよ、ということらしい。
クレイジー……

Discussion