fork download
  1. #!ruby
  2. # -*- encoding: UTF-8 -*-
  3.  
  4. =begin
  5. お題
  6.  
  7. https://e...content-available-to-author-only...h.edu/docs/transit_algorithms.html
  8.  
  9. まずこのサイトを読んで日時(UTC基準)からJDを求めるプログラムを作りなさい
  10. 逆にJDから日時(UTC基準)を求めるプログラムも作りなさい
  11.  
  12. このサイトに書いてあるとおりに作るとプログラムの結果は正しくならない
  13.  
  14. プログラムの結果が正しくなるように修正し、
  15. このサイトのどこに誤記があるかその箇所を指摘しなさい
  16.  
  17. #####################################################################
  18.  
  19. 日付への変換式が間違っている
  20. - e = int[365.25/d]
  21. + e = int[365.25*d] # または int[365.25d]
  22.  
  23. # frac は整数限定で % 1 にした
  24.  
  25. =end
  26.  
  27.  
  28. # JD = int[365.25y] + int[30.6001(m+1)]+B+1720996.5+D+UT/24.
  29. def jd( dy, dm, dd, th, tm, ts )
  30. if dm <= 2
  31. dy -= 1
  32. dm += 12
  33. end
  34. if dy < 1582 || dy == 1582 && ( dm < 10 || dm == 10 && dd < 15 )
  35. b = -2
  36. else
  37. b = dy.div(400) - dy.div(100)
  38. end
  39. ut = th + tm.fdiv(60) + ts.fdiv(3600)
  40.  
  41. (365.25*dy).to_i + (30.6001*(dm+1)).to_i + b + 1720996.5 + dd + ut.fdiv(24)
  42. end
  43.  
  44. def dmy( jd )
  45. a = (jd+0.5).to_i
  46. if a >= 2299161
  47. b = ( (a-1867216.25).fdiv(36524.25) ).to_i
  48. c = a + b - b.div(4) + 1525
  49. else
  50. c = a + 1524
  51. end
  52. d = ( (c-122.1)/365.25 ).to_i
  53. e = ( 365.25*d ).to_i ### e = int[365.25/d] --> int[365.25d]
  54. f = ( (c-e)/30.6001 ).to_i
  55.  
  56. dd = c - e - (30.6001*f).to_i + (jd + 0.5) % 1 # frac jd > 0
  57. dm = f - 1 - 12*f.div(14)
  58. dy = d - 4715 - (7 + dm).div(10)
  59.  
  60. [dy,dm,dd]
  61. end
  62.  
  63. utm = Time.now.utc
  64. puts utm.strftime( ' %Y/%m/%d %T (%Z)' )
  65. jd = jd( utm.year, utm.mon, utm.day, utm.hour, utm.min, utm.sec )
  66. puts "JD = #{jd}"
  67. dy,dm,dd = dmy( jd )
  68. puts "YMD = %d/%02d/%02d (UTC)" % [dy,dm,dd]
  69.  
  70.  
Success #stdin #stdout 0s 28224KB
stdin
Standard input is empty
stdout
      2018/10/08 17:38:41 (UTC)
JD  = 2458400.2351967595
YMD = 2018/10/08 (UTC)