新規作成 | 一覧 | RSS | FrontPage | 検索 | 更新履歴
[Calendar/When/Ruby/2.APIの使用例/1.前提となる概念/4.時刻系] (前:文字列変換|次:5.オブジェクトの指定) (English)

4.時刻系

時刻系(Time standard)

本ライブラリの時間位置 When::TM::TemporalPositionは、 dynamical_timeuniversal_timeという2系統の時刻系を管理します。

→関連クラス図 04.Ephemeris, 16.時間位置のためのデータ型

dynamical time

力学的に一様に流れる時間に対応します。物理学的時間座標を表す時刻系と言えます。

地球時での 1970-01-01T00:00:00 からの経過時間を128秒を単位としてあらわしたものです。

これは、時間位置の time_standard がWhen::TimeStandard::UniversalTimeであるか否かによらず、 すべての時間位置に共通です。このため分解能が「日」よりも細かい時間位置どうしの前後関係は dynamical_time によって判断します。

また、一項演算子+ は、dynamical time での経過日数を, ユリウス日と地球時1970-01-01T00:00:00で時計あわせしたものを返します。

時間間隔(When::TM::Duration)は、ISO 11404 の時間間隔に基づいて定義されたWhen::TM::IntervalLengthと ISO 8601 の時間間隔に基づいて定義されたWhen::TM::PeriodDurationという ふたつのサブクラスを持ちます。本ライブラリではWhen::TM::IntervalLengthによって dynamical_time を扱うようにしています。

例えば、2009-01-01T00:00:00Z の直前に閏秒が入るため、

 When::when?('2009-01-01T00:00:00Z') - When::TM::IntervalLength.new(60, 'second')

は 2008-12-31T23:59:01Zに対応する When::TM::DateAndTimeを返します。このように When::TM::CalDateWhen::TM::IntervalLengthの加減算は期待通りにならない場合があります。

universal time

暦の上での時間に対応します。自転周期に基づいた時刻系と言えます。

時間位置の time_standard が When::TimeStandard::UniversalTime である場合、 協定世界時での 1970-01-01T00:00:00 からの経過時間を128秒を単位としてあらわしたものになります。この場合、

1970-01-01T00:00:00Z(unix timeの原点)の時点で、

 dynamical_time - universal_time = (40 + 377/2048)秒 ≒ 40.184082秒

としています。これは、こちらの式を使ったほぼ誤差のない値です。 1972-01-01T00:00:00Zに、この差を(42 + 377/2048)秒とし、それ以降、閏秒が入るごとに +1秒するようにしています。 本来は正確に42.184+整数秒なのですが、本ライブラリでは dynamical_time - universal_time を 1/2048 秒単位で管理しているため、 82μ秒の誤差があります。

また、メソッドto_f は、universal time での経過日数を, ユリウス日と協定世界時1970-01-01T00:00:00Zで時計あわせしたものを返します。

本ライブラリでは When::TM::PeriodDurationによって universal_time を扱うようにしています。

例えば、2009-01-01T00:00:00Z の直前に閏秒が入りますが、

 When::when?('2009-01-01T00:00:00Z') - When::Duration('PT60S')

は 2008-12-31T23:59:00Zに対応する When::TM::DateAndTimeを返します。

このようなIntervalLengthとPeriodDurationの使い分けは本ライブラリのローカルな仕様です。

なお、When::V::Eventで BYSECOND の指定を用いる場合も閏秒は扱えません。60秒の指定は59秒に読み替えます。

その他の時刻系

時間位置の time_standard が When::TimeStandard::UniversalTime でない場合、universal_timeメソッドは 独自の暦時間を表現することとなります。

これらのように独自の暦時間を用いていても、時間位置どうしの前後関係は dynamical_timeによって正しく判断できます。