💨

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. パターン1:サマータイム無のタイムゾーンを指定
  2. パターン2:サマータイム有のタイムゾーンを指定、サマータイム期間外の日時を指定
  3. パターン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