前回のセッションでは、日時(Date/Time)に関する基本的な定義やTime Zoneの導入部分を確認しました。
F は Number型である。Day, TimeWithinDay, DaysInYear, MonthFromTime など多数の操作が存在。UTCEpochNanosecondsなどは1始まり)。ZoneName(例: Asia/Tokyo)や IANA Database へのリンク定義。JST)を勝手に使うべきではない。次回(今回)は GetNamedTimeZoneEpochNanoseconds から読み進めることになっていました。
この操作は実装定義(Implementation Defined)であり、名前付きタイムゾーンにおける特定の日時(壁時計時間)に対応するエポックナノ秒を取得します。
GetNamedTimeZoneEpochNanoseconds(
timeZoneIdentifier, // String
year, month, day, // Integers (month, dayは inclusive interval: 1-12, 1-31)
hour, minute, second,
millisecond, microsecond, nanosecond
)
入力された「ローカル時間(壁時計時間)」の解釈には以下のパターンがあります。
2017-11-05 01:30 (DST終了日)
[UTC 05:30, UTC 06:30] のような2つの値を含むリスト。2017-03-12 02:30 (DST開始日)
[] (空リスト)。タイムゾーンの政治的ルール(Local Political Rules)を持たない実装の場合の振る舞い:
timeZoneIdentifier が “UTC” であると断定(Assert)する。指定されたエポックナノ秒時点での、UTCからのオフセットを返します。
timeZoneIdentifier, epochNanoseconds0 を返す(UTC扱い)。AvailableNamedTimeZoneIdentifiers が返すリストの要素として使用されるレコード型です。
[[Field]] のように二重括弧でフィールド名が示される。| フィールド名 | 説明 |
|---|---|
[[Identifier]] |
実装がサポートする利用可能な名前付きタイムゾーン識別子(String)。 |
[[PrimaryIdentifier]] |
[[Identifier]] に対応するプライマリ(正規化された)タイムゾーン識別子。 |
[[Identifier]] がエイリアス(Link Name)の場合、[[PrimaryIdentifier]] にはその解決先(Zone Name)が入る。同一の場合は同じ値が入る。TimeZoneIdentifierRecord のリストを返す。UTC のみを含むリストを返す。ホスト環境の現在のタイムゾーンを表す文字列を返します。
IsTimeZoneOffsetString が true を返す形式。+09:00, -0500 など。+09:00)ではなく、可能な限りホスト環境の設定に対応する IANAタイムゾーン名(例: America/New_York)を返すことが推奨される。SystemTimeZoneIdentifier は “America/New_York” を返すべきである。UTCの時刻値(Time Value)をローカル時刻(数値)に変換します。
LocalTime(t)
t (Finite Time Value / UTC)timeZoneIdentifier = SystemTimeZoneIdentifier()offsetNs(オフセットナノ秒)を取得:
GetNamedTimeZoneOffsetNanoseconds を呼び出し、t(ミリ秒)をナノ秒($10^6$倍)に換算して渡す。offsetMs = offsetNs / $10^6$ (切り捨て)t + offsetMst に対応するローカル時刻が存在しないことはない(常に1つに定まる)。ローカル時刻(数値)をUTCの時刻値(Time Value)に変換します。LocalTime の逆操作ですが、複雑です。
UTC(t)
t (Number / Local Time)t が有限でなければ NaN を返す。timeZoneIdentifier = SystemTimeZoneIdentifier()possibleInstants = GetNamedTimeZoneEpochNanoseconds(..., tの各要素)possibleInstants が空でない場合、possibleInstants[0] を採用する。Date オブジェクトの複雑さや不備を解消するための新しい日時API。Date 仕様とは別に Temporal 名前空間として定義されているようだ。GetNamedTimeZoneEpochNanosecondsなど)は既存仕様の話であり、Temporalが入っても残る部分。10^6 で割ったり掛けたりする変換が多い。PossibleInstants が空の場合や複数ある場合の挙動、アルゴリズムの詳細について、記憶が薄れることを見越して最初から確認し直す。