----Next_Part(Sun_Mar__8_18:59:11_1998_651)--
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
ふなばです。
ダテクラスに少し手を入れました。
ダテクラスでは改暦日を自由に設定できるので、すこし解釈が厄介なところが
あります。といっても、普通は気にすることはないと思います。ですが、一応、
ダテクラスとしての解釈を用意しておくことにします。
yday は常にときの暦に於ける年の1月1日からの通日になります。た
とえば、デンマークでは1700年3月1日に改暦がおこなわれたらしいのですが、
1700年2月18日は49日、翌日の3月1日は60日となります。
leap? は年の途中で改暦した場合には、同じ年でも改暦前と改暦後で値が異る
ことがあります。デンマークにおいては1700年2月18日までは閏年、翌日の3月
1日以降は平年となります。
あと、範囲をあつかいたいので、downto/upto をつけ加えました。
--Tadayoshi Funaba
----Next_Part(Sun_Mar__8_18:59:11_1998_651)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Description: date.rb
# date.rb: Written by Tadayoshi Funaba 1998
# $Id: date.rb,v 1.3 1998/03/08 09:43:54 tadf Exp $
class Date
include Comparable
MONTHNAMES '', 'January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December' ]
DAYNAMES 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday',
'Friday', 'Saturday' ]
GREGORY 299161 # Oct 15, 1582
ENGLAND 361222 # Sept 14, 1752
def Date.civil_to_jd(y, m, d, gs rue)
if m < then
y -
m + 2
end
a y / 100).to_i
b a / 4).to_i
c - a + b
e 365.25 * (y + 4716)).to_i
f 30.6001 * (m + 1)).to_i
jd + d + e + f - 1524
unless
(if gs.kind_of? Numeric then jd > s else gs end) then
jd -
end
return jd
end
def Date.jd_to_civil(jd, gs rue)
unless
(if gs.kind_of? Numeric then jd > s else gs end) then
a d
else
w (jd - 1867216.25) / 36524.25).to_i
x w / 4).to_i
a d + 1 + w - x
end
b + 1524
c (b - 122.1) / 365.25).to_i
d 365.25 * c).to_i
e (b - d) / 30.6001).to_i
f 30.6001 * e).to_i
day - d - f
if e < 3 then
m - 1
else
m - 13
end
if m < then
y - 4715
else
y - 4716
end
return y, m, day
end
def Date.mjd_to_jd(mjd)
mjd + 2400000.5
end
def Date.jd_to_mjd(jd)
jd - 2400000.5
end
def Date.tjd_to_jd(tjd)
tjd + 2440000.5
end
def Date.jd_to_tjd(jd)
jd - 2440000.5
end
def initialize(jd , gs REGORY)
@jd d
@gs s
end
def Date.new3(y 4712, m , d , gs REGORY)
jd ate.civil_to_jd(y, m, d, gs)
y2, m2, d2 ate.jd_to_civil(jd, gs)
unless y y2 and m m2 and d d2 then
raise ArgumentError, 'invalid date'
end
Date.new(jd, gs)
end
def Date.today(gs REGORY)
Date.new3(*(Time.now.to_a[3..5].reverse << gs))
end
def jd
@jd
end
def mjd
Date.jd_to_mjd(@jd)
end
def tjd
Date.jd_to_tjd(@jd)
end
def year
Date.jd_to_civil(@jd, @gs)[0]
end
def yday
gs f @gs.kind_of? Numeric then @jd > gs else @gs end
jd ate.civil_to_jd(year - 1, 12, 31, gs)
@jd - jd
end
def mon
Date.jd_to_civil(@jd, @gs)[1]
end
def mday
Date.jd_to_civil(@jd, @gs)[2]
end
def wday
k @jd + 1) % 7
k + if k < 0
k
end
def leap?
gs f @gs.kind_of? Numeric then @jd > gs else @gs end
jd ate.civil_to_jd(year, 2, 28, gs)
Date.jd_to_civil(jd + 1, gs)[1] 2
end
def + (other)
if other.kind_of? Numeric then
return Date.new(@jd + other, @gs)
end
raise TypeError, 'expected numeric'
end
def - (other)
if other.kind_of? Numeric then
return Date.new(@jd - other, @gs)
elsif other.kind_of? Date then
return @jd - other.jd
end
raise TypeError, 'expected numeric or date'
end
def <