以下のスクリプトの実行結果
2098 2001/01/01 2001 01 01
J_day と date は互いに逆関数の関係にある。
これらを使うと、曜日とか、ある年が閏年かとかを求める関数を作れる。
BEGIN {
print J_day(2001, 1, 1)-J_day(1995, 4, 5) # 経過日数の計算
print date(J_day(1995, 4, 5)+2098) # 日数経過後の年月日
split(date(J_day(1995, 4, 5)+2098), ymd, "/") # ばらして配列へ
print ymd[1], ymd[2], ymd[3]
}
# 西暦年月日からユリウス日を得る
# y 年 m 月 d 日
function J_day(y, m, d)
{
return d-32075+int( 1461*(y+4800+ int( (m-14)/12) )/4 ) \
+int( 367*(m-2-int( (m-14)/12 )*12)/12 ) \
-int( 3*( int( (y+4900+int( (m-14)/12 ))/100 ) )/4 )
}
# ユリウス日から西暦年月日を得る
function date(jul, l, n, iy, jm, kd)
{
l = jul+68569
n = int(4*l/146097)
l -= int((146097*n+3)/4)
iy = int(4000*(l+1)/1461001)
l -= int(1461*iy/4)-31
jm = int(80*l/2447)
kd = l-int(2447*jm/80)
l = int(jm/11)
jm = jm+2-12*l
iy = 100*(n-49)+iy+l
return sprintf("%4d/%02d/%02d", iy, jm, kd)
}