🐷

なぜ、JavaScriptはnew Date()で正確な現在時刻を取得できるのか?

2021/07/12に公開

※ 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) と表します

    とも呼ばれています

  • 例: 1628467200000

どうやってEpochからの経過時間を計測しているのか?

  • OSはでOS内で、保持している時刻変数に発振器駆動H/Wカウンタから読み取った値をUNIX Timeに加算しています
  • 加算されたUNIX Timeは tz databaseによってUTC(協定世界時)に変換されます
    • 例: 16284672000002021-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