→関連クラス図 10.Duration
require 'when_exe' include When
コア拡張を利用する場合はコア拡張を参照
When::TM::Durationのみを利用する場合は最小セットを参照
date = when?('2013-03-25') p date #=> 2013-03-25 duration = Duration('P1Y2M3D') p duration #=> P1Y2M3D p date + duration #=> 2014-05-28 p date - duration #=> 2012-01-22 duration2 = duration * 2 p duration2 #=> P2Y4M6D p duration2 + duration #=> P3Y6M9D p duration2 - duration #=> P1Y2M3D p date + duration2 #=> 2015-07-31 p duration2 / 2 #=> P1Y2M3D begin p duration2 / duration rescue => e #=> TypeError: nil can't be coerced into Float p e end
start = when?('2013-03-25') p start #=> 2013-03-25 stop = when?('2016-01-01') p stop #=> 2016-01-01 duration = Duration('P1Y2M3D') (start ^ duration).each do |date| break if date >= stop p date #=> 2013-03-25,2014-05-28,2015-07-31 end duration.enum_for(start, :forward, 3).each do |date| p date #=> 2013-03-25,2014-05-28,2015-07-31 end
time = when?('2013-03-25T01:23:45') p time #=> 2013-03-25T01:23:45Z duration = Duration('3s') p duration #=> 3s p time + duration #=> 2013-03-25T01:23:48Z p time - duration #=> 2013-03-25T01:23:42Z duration2 = duration * 2 p duration2 #=> 6s p duration2 + duration #=> 9.0s p duration2 - duration #=> 3.0s p time + duration2 #=> 2013-03-25T01:23:51Z p duration2 / 2 #=> 3.0s p duration2 / duration #=> 2.0
start = when?('2013-03-25T01:23:45') p start #=> 2013-03-25T01:23:45Z stop = when?('2013-03-25T01:23:54') p stop #=> 2013-03-25T01:23:54Z duration = Duration('3s') (start ^ duration).each do |time| break if time >= stop p time #=> 2013-03-25T01:23:45Z,2013-03-25T01:23:48Z,2013-03-25T01:23:51Z end duration.enum_for(start, :forward, 3).each do |time| p time #=> 2013-03-25T01:23:45Z,2013-03-25T01:23:48Z,2013-03-25T01:23:51Z end
time = when?('2013-03-25T01:23:45') p time #=> 2013-03-25T01:23:45Z duration = TM::Duration.second(3) p duration #=> [0, 0, 0, 3.0] p time + duration #=> 2013-03-25T01:23:48Z p time - duration #=> 2013-03-25T01:23:42Z duration2 = duration * 2 p duration2 #=> [0, 0, 0, 6.0] p duration2 + duration #=> [0, 0, 0, 9.0] p duration2 - duration #=> [0, 0, 0, 3.0] p time + duration2 #=> 2013-03-25T01:23:51Z p duration2 / 2 #=> [0, 0, 0, 3.0] p duration2 / duration #=> 2.0
start = when?('2013-03-25T01:23:45') p start #=> 2013-03-25T01:23:45Z stop = when?('2013-03-25T01:23:54') p stop #=> 2013-03-25T01:23:54Z duration = TM::Duration.second(3) (start ^ duration).each do |time| break if time >= stop p time #=> 2013-03-25T01:23:45Z,2013-03-25T01:23:48Z,2013-03-25T01:23:51Z end duration.enum_for(start, :forward, 3).each do |time| p time #=> 2013-03-25T01:23:45Z,2013-03-25T01:23:48Z,2013-03-25T01:23:51Z end
time1 = when?('2013-03-25T01:23:45') time2 = when?('2013-03-26T01:23:45') duration = time2 - time1 p [duration, duration.class] # => [86400.0s, When::TM::IntervalLength]
分解能が「日」よりも細かい時間位置の差はWhen::TM::IntervalLengthになる。
date1 = when?('2013-03-25') date2 = when?('2013-03-26') duration = date2 - date1 p [duration, duration.class] # => [P1D, When::TM::PeriodDuration]
分解能が「日」またはそれより粗い時間位置の差は「日」を単位とするWhen::TM::PeriodDurationになる。
date3 = when?('215-20-17^^Darian') duration = date3 - date1 p [duration, duration.class] # => [14434.504952669144s, When::TM::IntervalLength]
グレゴリオ暦と火星暦のように歩度の異なる暦で表された時間位置の差は分解能に関係なくWhen::TM::IntervalLengthになる。