#!ruby
# -*- encoding: UTF-8 -*-
=begin
お題
https://e...content-available-to-author-only...h.edu/docs/transit_algorithms.html
まずこのサイトを読んで日時(UTC基準)からJDを求めるプログラムを作りなさい
逆にJDから日時(UTC基準)を求めるプログラムも作りなさい
このサイトに書いてあるとおりに作るとプログラムの結果は正しくならない
プログラムの結果が正しくなるように修正し、
このサイトのどこに誤記があるかその箇所を指摘しなさい
#####################################################################
日付への変換式が間違っている
- e = int[365.25/d]
+ e = int[365.25*d] # または int[365.25d]
# frac は整数限定で % 1 にした
=end
# JD = int[365.25y] + int[30.6001(m+1)]+B+1720996.5+D+UT/24.
def jd( dy, dm, dd, th, tm, ts )
if dm <= 2
dy -= 1
dm += 12
end
if dy < 1582 || dy == 1582 && ( dm < 10 || dm == 10 && dd < 15 )
b = -2
else
b = dy.div(400) - dy.div(100)
end
ut = th + tm.fdiv(60) + ts.fdiv(3600)
(365.25*dy).to_i + (30.6001*(dm+1)).to_i + b + 1720996.5 + dd + ut.fdiv(24)
end
def dmy( jd )
a = (jd+0.5).to_i
if a >= 2299161
b = ( (a-1867216.25).fdiv(36524.25) ).to_i
c = a + b - b.div(4) + 1525
else
c = a + 1524
end
d = ( (c-122.1)/365.25 ).to_i
e = ( 365.25*d ).to_i ### e = int[365.25/d] --> int[365.25d]
f = ( (c-e)/30.6001 ).to_i
dd = c - e - (30.6001*f).to_i + (jd + 0.5) % 1 # frac jd > 0
dm = f - 1 - 12*f.div(14)
dy = d - 4715 - (7 + dm).div(10)
[dy,dm,dd]
end
utm = Time.now.utc
puts utm.strftime( ' %Y/%m/%d %T (%Z)' )
jd = jd( utm.year, utm.mon, utm.day, utm.hour, utm.min, utm.sec )
puts "JD = #{jd}"
dy,dm,dd = dmy( jd )
puts "YMD = %d/%02d/%02d (UTC)" % [dy,dm,dd]
IyFydWJ5CiMgLSotIGVuY29kaW5nOiBVVEYtOCAtKi0KCj1iZWdpbgrjgYrpoYwKCmh0dHBzOi8vZS4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uaC5lZHUvZG9jcy90cmFuc2l0X2FsZ29yaXRobXMuaHRtbAoK44G+44Ga44GT44Gu7727772y776E44KS6Kqt44KT44Gn5pel5pmCKFVUQ+Wfuua6linjgYvjgolKROOCkuaxguOCgeOCi+++jO++n+++m++9uO++nu++l+++keOCkuS9nOOCiuOBquOBleOBhArpgIbjgatKROOBi+OCieaXpeaZgihVVEPln7rmupYp44KS5rGC44KB44KL776M776f776b7724776e776X776R44KC5L2c44KK44Gq44GV44GEIAoK44GT44Gu7727772y776E44Gr5pu444GE44Gm44GC44KL44Go44GK44KK44Gr5L2c44KL44Go776M776f776b7724776e776X776R44Gu57WQ5p6c44Gv5q2j44GX44GP44Gq44KJ44Gq44GECgrvvozvvp/vvpvvvbjvvp7vvpfvvpHjga7ntZDmnpzjgYzmraPjgZfjgY/jgarjgovjgojjgYbjgavkv67mraPjgZfjgIEK44GT44Gu7727772y776E44Gu44Gp44GT44Gr6Kqk6KiY44GM44GC44KL44GL44Gd44Gu566H5omA44KS5oyH5pGY44GX44Gq44GV44GEIAoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoJ5pel5LuY44G444Gu5aSJ5o+b5byP44GM6ZaT6YGV44Gj44Gm44GE44KLCi0JZSA9IGludFszNjUuMjUvZF0KKwllID0gaW50WzM2NS4yNSpkXSAjIOOBvuOBn+OBryBpbnRbMzY1LjI1ZF0KCiMgZnJhYyDjga/mlbTmlbDpmZDlrprjgacgJSAxIOOBq+OBl+OBnwoKPWVuZAoKCiMgSkQgPSBpbnRbMzY1LjI1eV0gKyBpbnRbMzAuNjAwMShtKzEpXStCKzE3MjA5OTYuNStEK1VULzI0LgpkZWYgamQoIGR5LCBkbSwgZGQsIHRoLCB0bSwgdHMgKQoJaWYgZG0gPD0gMgoJCWR5IC09IDEKCQlkbSArPSAxMgoJZW5kCglpZiBkeSA8IDE1ODIgfHwgZHkgPT0gMTU4MiAmJiAoIGRtIDwgMTAgfHwgZG0gPT0gMTAgJiYgZGQgPCAxNSApCgkJYiA9IC0yCgllbHNlCgkJYiA9IGR5LmRpdig0MDApIC0gZHkuZGl2KDEwMCkKCWVuZAoJdXQgPSB0aCArIHRtLmZkaXYoNjApICsgdHMuZmRpdigzNjAwKQoKCSgzNjUuMjUqZHkpLnRvX2kgKyAoMzAuNjAwMSooZG0rMSkpLnRvX2kgKyBiICsgMTcyMDk5Ni41ICsgZGQgKyB1dC5mZGl2KDI0KQplbmQKCmRlZiBkbXkoIGpkICkKCWEgPSAoamQrMC41KS50b19pCglpZiBhID49IDIyOTkxNjEKCQliID0gKCAoYS0xODY3MjE2LjI1KS5mZGl2KDM2NTI0LjI1KSApLnRvX2kKCQljID0gYSArIGIgLSBiLmRpdig0KSArIDE1MjUKCWVsc2UKCQljID0gYSArIDE1MjQKCWVuZAoJZCA9ICggKGMtMTIyLjEpLzM2NS4yNSApLnRvX2kKCWUgPSAoIDM2NS4yNSpkICkudG9faQkJIyMjIGUgCT0gaW50WzM2NS4yNS9kXSAtLT4gaW50WzM2NS4yNWRdCglmID0gKCAoYy1lKS8zMC42MDAxICkudG9faQoKCWRkID0gYyAtIGUgLSAoMzAuNjAwMSpmKS50b19pICsgKGpkICsgMC41KSAlIDEJCSMgZnJhYyBqZCA+IDAKCWRtID0gZiAtIDEgLSAxMipmLmRpdigxNCkKCWR5ID0gZCAtIDQ3MTUgLSAoNyArIGRtKS5kaXYoMTApCgoJW2R5LGRtLGRkXQplbmQKCgl1dG0gPSBUaW1lLm5vdy51dGMKCXB1dHMgdXRtLnN0cmZ0aW1lKCAnICAgICAgJVkvJW0vJWQgJVQgKCVaKScgKQoJamQgPSBqZCggdXRtLnllYXIsIHV0bS5tb24sIHV0bS5kYXksIHV0bS5ob3VyLCB1dG0ubWluLCB1dG0uc2VjICkKCXB1dHMgIkpEICA9ICN7amR9IgoJZHksZG0sZGQgPSBkbXkoIGpkICkKCXB1dHMgIllNRCA9ICVkLyUwMmQvJTAyZCAoVVRDKSIgJSBbZHksZG0sZGRdCgo=