🐷
なぜ、JavaScriptはnew Date()で正確な現在時刻を取得できるのか?
※ UNIX系OSを前提にしています
JavaScriptとUnix Timeのお話
JavaScriptのDateオブジェクト
- JavaScriptでは、
new Date()
でDate インスタンスを生成することで
現在時刻をDateオブジェクトとして取得することができます
- このDate オブジェクトは
1970 年 1 月 1 日 (UTC)
からの経過ミリ秒数を Number型 で保持しています - 例:
2021-07-09T15:00:00.000Z
Unix Time
-
UTC(協定世界時) の 1970年1月1日午前0時0分0秒からの経過時間を秒数(整数)で表したものです
- Posix Time
- Epoch Time
- Epoch自体が経過時間を計る起点を表していて、UNIXでは
1970年1月1日0:00:00 (UTC)
と表します
- Epoch自体が経過時間を計る起点を表していて、UNIXでは
とも呼ばれています
-
例:
1628467200000
どうやってEpochからの経過時間を計測しているのか?
- OSはでOS内で、保持している時刻変数に発振器駆動H/Wカウンタから読み取った値をUNIX Timeに加算しています
- 加算されたUNIX Timeは
tz database
によってUTC(協定世界時)に変換されます- 例:
1628467200000
→2021-07-09T15:00:00.000Z
- 当然ここで、各地域の標準時を元に変換
- 例:
サマータイムやうるう秒はどうやって対応しているのか?
サマータイム
- 例1
-
1520751599
2018年2月11日(Sun) 01:59:59(EST)
- ↓サマータイム↓
-
1520751600
2018年2月11日(Sun) 03:00:00 (EDT)
-
- 例2
-
1541311199
2018年11月4日(Sun) 01:59:59 (EDT)
- ↑サマータイム↑
-
1541311200
2018年11月4日(Sun) 01:00:00 (EST)
-
- 上記の例のようにUNIX Timeは連続した整数ですが、
tz database
によって変換されたカレンダー時間は、ジャンプしています - UNIX Timeは連続性を保ち、サマータイムはカレンダー時間側で対応していることが分かります
うるう秒
- やっかいなのはうるう秒で、UNIX Timeの連続性に大きな影響があります
- UNIX Timeはうるう秒調整は無視するため、1秒のうるう秒が発生した場合は、うるう秒分ずれることになります
- うるう秒の対策はプログラムを使用することもできますが、NTPサーバとの同期によってズレを解消します。
- この、
うるう秒対策
によってシステムやデータベースへ影響を及ぼすことがあります - UNIX timeでは、
78796799
の次は78796800
となりますが、UTC(協定世界時)では1972年6月30日23:59:59
の次に1972年6月30日23:59:60
が挿入されうるう秒を表現してるため、違いが分かるかと思います
JavaScript が new Date() で正確な現在時刻を取得できる仕組み
- JavaScriptは、
ECMAScript Epoch
からの経過ミリ秒(ECMAScript Epoch
の1/1000)で指定されます - また new Date() によって、Dateオブジェクトを作ります
-
ECMAScript Epoch
はUTC(協定世界時)の1970年1月1日深夜0時のこと - Dateオブジェクトは、日付や時間などを扱うためのメソッドが定義されており、これらを使用することで、時間の計算や日付の換算等を簡単に行うことができる
- 例: getFullYear(), getMonth() 等
-
- new Date() では、ローカルマシンの日付設定やタイムゾーンによって決まります
Discussion