→関連クラス図 04.Ephemeris, 16.時間位置のためのデータ型
力学的に一様に流れる時間に対応します。物理学的時間座標を表す時刻系と言えます。
地球時での 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::CalDateとWhen::TM::IntervalLengthの加減算は期待通りにならない場合があります。
暦の上での時間に対応します。自転周期に基づいた時刻系と言えます。
時間位置の 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によって正しく判断できます。