require 'when_exe' include When
標準時を日本時間にしておく
TM::Clock.local_time = '+09:00'
date = when?('2014-01-01') #=> 2014-01-01 p date.class #=> When::TM::CalDate note = CalendarNote('SolarTerms') p note.class #=> When::CalendarNote::SolarTerms p note.term(date, 270) #=> 2014-12-22 (2014-01-01の直後の冬至) p note.term(date, -90) #=> 2013-12-22 (2014-01-01の直前の冬至)
date = when?('2014-01-01') #=> 2014-01-01 p date.class #=> When::TM::CalDate p date.frame.class #=> When::CalendarTypes::Gregorian p date.frame.note.class #=> When::CalendarNote::Christian p date.term(270) #=> 2014-12-22 (2014-01-01の直後の冬至) p date.term(-90) #=> 2013-12-22 (2014-01-01の直前の冬至)
When::CalendarNote::Christianには term メソッドがないため、代替してWhen::CalendarNote::SolarTermsが使用される
time = when?('2014-01-01T00:00') #=> 2014-01-01T00:00+09:00 p time.class #=> When::TM::DateAndTime note = CalendarNote('SolarTerms') p note.class #=> When::CalendarNote::SolarTerms p note.term(time) #=> 2014-03-21T01:56+09:00 (2014-01-01の直後の春分, time と同じ分解能) p note.term(time, -360) #=> 2013-03-20T20:02+09:00 (2014-01-01の直前の春分, time と同じ分解能)
time = when?('2014-01-01T00:00') #=> 2014-01-01T00:00+09:00 p time.class #=> When::TM::DateAndTime p time.frame.class #=> When::CalendarTypes::Gregorian p time.frame.note.class #=> When::CalendarNote::Christian p time.term #=> 2014-03-21T01:56+09:00 (2014-01-01の直後の春分, time と同じ分解能) p time.term(-360) #=> 2013-03-20T20:02+09:00 (2014-01-01の直前の春分, time と同じ分解能)
term メソッドの引数 0(=太陽黄経 0 度)は省略できる
require 'date' date = Date.new(2014,1,1) #=> #<Date: 2014-01-01 (4913317/2,0,2299161)> time = DateTime.new(2014,1,1) #=> #<DateTime: 2014-01-01T00:00:00+00:00 (4913317/2,0,2299161)> note = CalendarNote('SolarTerms') p note.class #=> When::CalendarNote::SolarTerms p note.term(date) #=> 2014-03-21 p note.term(time) #=> 2014-03-20T16:56:55.09Z
require 'when_exe/core/extension' date = Date.new(2014,1,1) #=> #<Date: 2014-01-01 (4913317/2,0,2299161)> time = DateTime.new(2014,1,1) #=> #<DateTime: 2014-01-01T00:00:00+00:00 (4913317/2,0,2299161)> p date.term #=> #<Date: 2014-03-21 (4913475/2,0,2299161)> p time.term #=> #<DateTime: 2014-03-20T16:56:55+00:00 (42452418923/17280,0/1,2299161)>
冬至の日付を移動して朔旦冬至にした建仁2~3年を例にする
標準時を未定義にしておく
TM::Clock.local_time = nil
date = when?('建仁03.01.01') #=> 建仁03(1203).01.01 p date.class #=> When::TM::CalDate p date.frame.note.class #=> When::CalendarNote::JapaneseNote p date.term(270) #=> 建仁03(1203).11.12 p date.term(-90) #=> 建仁02(1202).11.01*
When::CalendarNote::JapaneseNoteの term メソッドが使われ、当時行用されていた宣明暦で計算が行われる
宣明暦での建仁2年の冬至は建仁02(1202).11.01の前日であるため * が付く
(* は<When.exe Standard Representation (1.日付時刻の表現)> で前日を意味する)
date = when?('建仁02.01.01') #=> 建仁02(1202).01.01 25.times do # [0,15] は「太陽黄経を15で割って0余る」という指定 date = date.ceil.term([0,15]) p date #=> 下記 # 建仁02(1202).01.05 # 建仁02(1202).01.20 # 建仁02(1202).02.06 # 建仁02(1202).02.22 # 建仁02(1202).03.07 # 建仁02(1202).03.22 # 建仁02(1202).04.08 # 建仁02(1202).04.23 # 建仁02(1202).05.10 # 建仁02(1202).05.25 # 建仁02(1202).06.10 # 建仁02(1202).06.25 # 建仁02(1202).07.12 # 建仁02(1202).07.27 # 建仁02(1202).08.13 # 建仁02(1202).08.28 # 建仁02(1202).09.13 # 建仁02(1202).09.29 # 建仁02(1202).10.14 # 建仁02(1202).10.29 # 建仁02(1202).10=14 # 建仁02(1202).11.01* # 建仁02(1202).11.16 # 建仁02(1202).12.01 # 建仁02(1202).12.16 end
When::TM::CalDateオブジェクトはその日付の正午に丸められるため ceil メソッドで日付をすすめる必要がある
二十四節気の時刻まで知りたい場合についてはブログ記事2015-10-11の元嘉暦の例を参照のこと