moment-timezone のバージョンが古くてサマータイムの切り替わりで日付処理がバグった

Tadashi Shigeoka ·  Tue, November 8, 2016

Moment Timezone の古いバージョンを使っていて、先日のサマータイムの終了日時 2016年11月6日(日)02時00分 PDT を境目に UTC から PDT/PST への変換がバグってしまう問題に遭遇しました。

結果的には、使っていた moment-timezone のバージョンが古かったので、バージョンを最新にしたことで解決しました。

[email protected] を使った場合

超古いバージョン 0.0.3 を利用した場合、タイムゾーン America/Los_Angeles で 2016-11-07 のその日の終わりの日時を正しく取得することができません。

> var now = new Date("2016-11-09 17:30:00")
> var moment = require("moment-timezone")

> moment(now).tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-10 07:59:59'
> moment(now).subtract(1, "days").tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-09 07:59:59'
> moment(now).subtract(2, "days").tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-08 07:59:59'
> moment(now).subtract(3, "days").tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-06 07:59:59'
> moment(now).subtract(4, "days").tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-06 06:59:59'
> moment(now).subtract(5, "days").tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-05 06:59:59'

[email protected] を使った場合

最新バージョン 0.5.9 を利用した場合、2016-11-07 07:59:59 というように 2016-11-07 のその日の終わりの日時を正しく取得することができています。

> var now = new Date("2016-11-09 17:30:00")
> var moment = require("moment-timezone")

> moment(now).subtract(1, "days").tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-09 07:59:59'
> moment(now).subtract(2, "days").tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-08 07:59:59'
> moment(now).subtract(3, "days").tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-07 07:59:59'
> moment(now).subtract(4, "days").tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-06 06:59:59'
> moment(now).subtract(5, "days").tz("America/Los_Angeles").endOf("day").utc().format('YYYY-MM-DD HH:mm:ss')
'2016-11-05 06:59:59'

moment-timezone は定期的に最新バージョンにアップデートしないと

moment-timezone は IANA Time Zone Database + Moment.js なライブラリなので、IANA Time Zone データベースを最新に更新するためにもバージョンのアップデートは定期的にしないといけませんね。

海外向けサービスを開発しているので、定期的にタイムゾーンに苦しんでいる気がする・・・。