JavaScriptのmoment-timezoneでUnixtimeに変換する
はじめに
JavaScriptのmoment-timezoneライブラリを使って、日時をUnixtimeに変換する機会がありました。
タイムゾーンやサマータイムについても調べたので、moment-timezoneライブラリの使い方と併せて、本記事で紹介します。
Unixtimeとは?
Unixtimeとは、1970年1月1日(UTC)午前0時0分0秒を起点として、そこから何秒経過したかを整数で表した時刻のことです。
Unixtimeは、タイムゾーンやサマータイムの影響を受けずに、世界中で一意に時刻を表現できます。
主な用途
用途 | 説明 |
---|---|
データベースのタイムスタンプ | ソートや差分比較が簡単。日時クエリにも便利 |
ログ出力や監査 | イベントの発生順序を明確に記録可能 |
タイムゾーンとは?
タイムゾーン(Time Zone)とは、世界中の地域を標準時(UTC)からの時差で区切ったものです。
以下はタイムゾーンとUTCオフセットの例です:
地域・都市 | タイムゾーン ID | UTCオフセット |
---|---|---|
🇯🇵 日本(東京) | Asia/Tokyo | UTC+9 |
🇺🇸 アメリカ東部(NY) | America/New_York | UTC-5 |
🇺🇸 アメリカ西部(LA) | America/Los_Angeles | UTC-8 |
🇺🇸 アラスカ(アンカレッジ) | America/Anchorage | UTC-9 |
🇬🇧 イギリス(ロンドン) | Europe/London | UTC+0 |
🇩🇪 ドイツ(ベルリン) | Europe/Berlin | UTC+1 |
サマータイムとは?
概要
アメリカやヨーロッパの一部地域では、サマータイム(DST: Daylight Saving Timeの略) が適用されます。 これは夏季期間に日照時間を有効活用するため、現地時間を1時間進める制度です。
そのため、サマータイム適用中は、UTCからのズレにさらに+1h加算されます。
※日本など一部の国ではサマータイムは採用されていません。
以下は、先ほどの表にサマータイムを適用した場合のUTCからのズレを示したものです。
地域・都市 | タイムゾーン ID | UTCからのズレ | 備考 |
---|---|---|---|
🇯🇵 日本(東京) | Asia/Tokyo | UTC+9 | 日本はサマータイムが適用されないため、+9のまま |
🇺🇸 アメリカ東部(NY) | America/New_York | UTC-4 | |
🇺🇸 アメリカ西部(LA) | America/Los_Angeles | UTC-7 | |
🇺🇸 アラスカ(アンカレッジ) | America/Anchorage | UTC-8 | |
🇬🇧 イギリス(ロンドン) | Europe/London | UTC+1 | |
🇩🇪 ドイツ(ベルリン) | Europe/Berlin | UTC+2 |
サマータイム適用期間(2025年)
以下は、代表的なサマータイム適用地域における2025年の開始日と終了日です。
地域・都市 | 開始日時(2025) | 終了日時(2025) |
---|---|---|
🇺🇸 アメリカ東部(NY) | 3月9日(日)午前2時 → 3時 | 11月2日(日)午前2時 → 1時 |
🇺🇸 アメリカ西部(LA) | 3月9日(日)午前2時 → 3時 | 11月2日(日)午前2時 → 1時 |
🇺🇸 アラスカ(アンカレッジ) | 3月9日(日)午前2時 → 3時 | 11月2日(日)午前2時 → 1時 |
🇬🇧 イギリス(ロンドン) | 3月30日(日)午前1時 → 2時 | 10月26日(日)午前2時 → 1時 |
🇩🇪 ドイツ(ベルリン) | 3月30日(日)午前2時 → 3時 | 10月26日(日)午前3時 → 2時 |
moment-timezoneを使った日時のUnixtime変換
JavaScriptのmoment-timezoneを使うと、タイムゾーンとサマータイムを考慮して日時をunixtimeに変換することができます。
以下の実装例を紹介します:
- パターン1:サマータイム無のタイムゾーンを指定
- パターン2:サマータイム有のタイムゾーンを指定、サマータイム期間外の日時を指定
- パターン3:サマータイム有のタイムゾーンを指定、サマータイム期間内の日時を指定
パターン1:サマータイム無のタイムゾーンを指定
サマータイム無のタイムゾーンとして、Asia/Tokyoを指定します。
const moment = require('moment-timezone');
// Asia/TokyoはUTC+9
const tokyo = moment.tz('2025-07-01 12:00:00', 'Asia/Tokyo');
console.log('format :', tokyo.format());
console.log('Unixtime :', tokyo.unix());
出力結果は以下です。
format : 2025-07-01T12:00:00+09:00
UnixTime : 1751338800
パターン2:サマータイム有のタイムゾーンを指定、サマータイム期間外の日時を指定
サマータイム有のタイムゾーンとして、America/New_Yorkを、
サマータイム期間外の日時として、2025-01-15 12:00:00を指定します。
const moment = require('moment-timezone');
// America/New_Yorkのサマータイム期間外はUTC-5
const nyWinter = moment.tz('2025-01-15 12:00:00', 'America/New_York');
console.log('format :', nyWinter.format());
console.log('Unixtime :', nyWinter.unix());
出力結果は以下です。
format : 2025-01-15T12:00:00-05:00
UnixTime : 1736960400
パターン3:サマータイム有のタイムゾーンを指定、サマータイム期間内の日時を指定
サマータイム有のタイムゾーンとして、America/New_Yorkを、
サマータイム期間内の日時として、2025-07-01 12:00:00を指定します。
const moment = require('moment-timezone');
// America/New_Yorkのサマータイム期間外はUTC-4
const nySummer = moment.tz('2025-07-01 12:00:00', 'America/New_York');
console.log('format :', nySummer.format());
console.log('Unixtime :', nySummer.unix());
出力結果は以下です。
format : 2025-07-01T12:00:00-04:00
UnixTime : 1751385600
サマータイムの厄介な点
サマータイム開始時・終了時に、以下のような厄介な事象が発生します。
- サマータイム開始時:存在しない時間がある
- サマータイム終了時:「同じ表示の時刻」が1日に2回ある
サマータイム開始時:存在しない時間がある
2025年3月9日(日)午前2:00 → 午前3:00 に時計が進められます。
つまり、02:30という時刻は「存在しない」ことになります。
サマータイム終了時:「同じ表示の時刻」が1日に2回ある
アメリカ(ニューヨークなど)では、2025年11月2日(日)の午前2時にサマータイムが終了します。
このとき、時計は1時間巻き戻されて、午前2時が午前1時に戻ります。
その結果、次のような流れになります:
1:00 → 1:30 → 2:00(サマータイム中)
↓(サマータイム終了で時計が戻る)
1:00 → 1:30 → 2:00(標準時)
つまり、1:00〜1:59 の時間帯が2回繰り返されることになります。
moment-timezoneでの挙動を確認する
上述の2パターンについて、moment-timezoneを使ったときどのような挙動となるか確認してみます
サマータイム開始時:存在しない時間があるケース
const moment = require('moment-timezone');
// 存在しない時刻:サマータイム開始の 2:30
const dt = moment.tz('2025-03-09 02:30:00', 'America/New_York');
console.log('format :', dt.format());
console.log('Unixtime :', dt.unix());
出力結果は以下となり、存在しない時間をセットすると、自動的に+1hされます
format : 2025-03-09T03:30:00-04:00
UnixTime : 1741505400
サマータイム終了時:「同じ表示の時刻」が1日に2回あるケース
const moment = require('moment-timezone');
// サマータイム終了日の 1:30
const ambiguous = moment.tz('2025-11-02 01:30:00', 'America/New_York');
console.log('format :', dt.format());
console.log('Unixtime :', dt.unix());
出力結果は以下となり、自動的にサマータイム期間中の時刻として扱われます
※America/New_Yorkのサマータイム期間中はUTC-4hとなります。
format : 2025-11-02T01:30:00-04:00
unix : 1762061400
Discussion