「復活祭の満月」による太陰太陽暦
昨日の、
| もし1年の日数が今回計算したパターンになるような太陰太陽暦を定義して、
を、ちょっと定義してみました。
月の長さと名前は適当です。
require 'pp'
require 'when_exe'
include When
module CalendarTypes
#
# Easter Calendar
#
class Easter < TableBased
# 復活祭の満月
EasterFullMoon = CalendarNote('Christian?w=7')
# 年初の通日
#
# @param [Array] date ( 年 )
#
# @return [Integer] 年初の通日
#
def _sdn_(date)
EasterFullMoon.easter(date.first) - 13
end
private
# オブジェクトの正規化
def _normalize(args=[], options={})
@label = 'Easter'
# Month & Day Index
@indices ||= [
When.Index('Jewish::Month', {:branch=>{-1=>When.Resource('_m:Jewish::IntercalaryMonth::*')[0],
1=>When.Resource('_m:Jewish::IntercalaryMonth::*')[1]},
:shift=>6}),
When::Coordinates::DefaultDayIndex
]
# Month & Day Arrangement
@rule_table ||= {
353 => {'Length'=>[30,29,29,29] + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12' },
354 => {'Length'=>[30,29,30,29] + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12' },
355 => {'Length'=>[30,30,30,29] + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12' },
356 => {'Length'=>[30,30,30,30] + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12' },
382 => {'Length'=>[29,29,29,29,30] + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12*,12='},
383 => {'Length'=>[30,29,29,29,30] + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12*,12='},
384 => {'Length'=>[30,29,30,29,30] + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12*,12='},
385 => {'Length'=>[30,30,30,29,30] + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12*,12='}
}
super
end
end
end
EasterLuniSolar = Calendar('Easter')
5_700_000.times do |year|
full_moon = CalendarTypes::Easter::EasterFullMoon.easter(year)
nisan_14th = tm_pos(year,1,14, frame:EasterLuniSolar).to_i
pp [year, full_moon, nisan_14th] unless full_moon == nisan_14th
end
たしかにズレは一回も起こりません。
「復活祭の満月」は過ぎ越しの月の14日に固定されます。
| もし1年の日数が今回計算したパターンになるような太陰太陽暦を定義して、
を、ちょっと定義してみました。
月の長さと名前は適当です。
require 'pp'
require 'when_exe'
include When
module CalendarTypes
#
# Easter Calendar
#
class Easter < TableBased
# 復活祭の満月
EasterFullMoon = CalendarNote('Christian?w=7')
# 年初の通日
#
# @param [Array
#
# @return [Integer] 年初の通日
#
def _sdn_(date)
EasterFullMoon.easter(date.first) - 13
end
private
# オブジェクトの正規化
def _normalize(args=[], options={})
@label = 'Easter'
# Month & Day Index
@indices ||= [
When.Index('Jewish::Month', {:branch=>{-1=>When.Resource('_m:Jewish::IntercalaryMonth::*')[0],
1=>When.Resource('_m:Jewish::IntercalaryMonth::*')[1]},
:shift=>6}),
When::Coordinates::DefaultDayIndex
]
# Month & Day Arrangement
@rule_table ||= {
353 => {'Length'=>[30,29,29,29] + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12' },
354 => {'Length'=>[30,29,30,29] + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12' },
355 => {'Length'=>[30,30,30,29] + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12' },
356 => {'Length'=>[30,30,30,30] + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12' },
382 => {'Length'=>[29,29,29,29,30] + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12*,12='},
383 => {'Length'=>[30,29,29,29,30] + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12*,12='},
384 => {'Length'=>[30,29,30,29,30] + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12*,12='},
385 => {'Length'=>[30,30,30,29,30] + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12*,12='}
}
super
end
end
end
EasterLuniSolar = Calendar('Easter')
5_700_000.times do |year|
full_moon = CalendarTypes::Easter::EasterFullMoon.easter(year)
nisan_14th = tm_pos(year,1,14, frame:EasterLuniSolar).to_i
pp [year, full_moon, nisan_14th] unless full_moon == nisan_14th
end
たしかにズレは一回も起こりません。
「復活祭の満月」は過ぎ越しの月の14日に固定されます。
この記事へのコメント