when_exe 0.2.100 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (193) hide show
  1. data/LICENSE.ja.txt +25 -25
  2. data/LICENSE.txt +31 -31
  3. data/bin/irb.rc +5 -0
  4. data/bin/locales.rb +2 -2
  5. data/bin/when.rb +16 -0
  6. data/bin/when.rb.config +7 -0
  7. data/lib/when_exe.rb +616 -14
  8. data/lib/when_exe/basictypes.rb +615 -0
  9. data/lib/when_exe/calendartypes.rb +1700 -0
  10. data/lib/when_exe/coordinates.rb +1936 -0
  11. data/lib/when_exe/core/compatibility.rb +54 -0
  12. data/lib/when_exe/core/duration.rb +72 -72
  13. data/lib/when_exe/core/extension.rb +382 -0
  14. data/lib/when_exe/ephemeris.rb +1845 -0
  15. data/lib/when_exe/googlecalendar.rb +140 -0
  16. data/lib/when_exe/icalendar.rb +1587 -0
  17. data/lib/when_exe/inspect.rb +1237 -0
  18. data/lib/when_exe/locales/af.rb +90 -0
  19. data/lib/when_exe/locales/ar.rb +145 -0
  20. data/lib/when_exe/locales/az.rb +90 -0
  21. data/lib/when_exe/locales/bg.rb +90 -0
  22. data/lib/when_exe/locales/bn.rb +94 -0
  23. data/lib/when_exe/locales/bs.rb +121 -0
  24. data/lib/when_exe/locales/ca.rb +92 -0
  25. data/lib/when_exe/locales/cs.rb +107 -0
  26. data/lib/when_exe/locales/cy.rb +150 -0
  27. data/lib/when_exe/locales/da.rb +84 -0
  28. data/lib/when_exe/locales/de.rb +92 -0
  29. data/lib/when_exe/locales/de_AT.rb +92 -0
  30. data/lib/when_exe/locales/de_CH.rb +92 -0
  31. data/lib/when_exe/locales/el.rb +93 -0
  32. data/lib/when_exe/locales/en.rb +88 -0
  33. data/lib/when_exe/locales/en_AU.rb +88 -0
  34. data/lib/when_exe/locales/en_CA.rb +88 -0
  35. data/lib/when_exe/locales/en_GB.rb +88 -0
  36. data/lib/when_exe/locales/en_IN.rb +88 -0
  37. data/lib/when_exe/locales/en_NZ.rb +88 -0
  38. data/lib/when_exe/locales/eo.rb +89 -0
  39. data/lib/when_exe/locales/es.rb +84 -0
  40. data/lib/when_exe/locales/es_419.rb +84 -0
  41. data/lib/when_exe/locales/es_AR.rb +84 -0
  42. data/lib/when_exe/locales/es_CL.rb +84 -0
  43. data/lib/when_exe/locales/es_CO.rb +84 -0
  44. data/lib/when_exe/locales/es_MX.rb +84 -0
  45. data/lib/when_exe/locales/es_PE.rb +85 -0
  46. data/lib/when_exe/locales/es_VE.rb +84 -0
  47. data/lib/when_exe/locales/et.rb +94 -0
  48. data/lib/when_exe/locales/eu.rb +95 -0
  49. data/lib/when_exe/locales/fa.rb +80 -0
  50. data/lib/when_exe/locales/fi.rb +89 -0
  51. data/lib/when_exe/locales/fr.rb +88 -0
  52. data/lib/when_exe/locales/fr_CA.rb +88 -0
  53. data/lib/when_exe/locales/fr_CH.rb +88 -0
  54. data/lib/when_exe/locales/gl.rb +81 -0
  55. data/lib/when_exe/locales/he.rb +84 -0
  56. data/lib/when_exe/locales/hi.rb +80 -0
  57. data/lib/when_exe/locales/hi_IN.rb +84 -0
  58. data/lib/when_exe/locales/hr.rb +128 -0
  59. data/lib/when_exe/locales/hu.rb +84 -0
  60. data/lib/when_exe/locales/id.rb +89 -0
  61. data/lib/when_exe/locales/is.rb +89 -0
  62. data/lib/when_exe/locales/it.rb +87 -0
  63. data/lib/when_exe/locales/it_CH.rb +87 -0
  64. data/lib/when_exe/locales/ja.rb +78 -0
  65. data/lib/when_exe/locales/kn.rb +86 -0
  66. data/lib/when_exe/locales/ko.rb +78 -0
  67. data/lib/when_exe/locales/links.rb +2342 -0
  68. data/lib/when_exe/locales/lo.rb +123 -0
  69. data/lib/when_exe/locales/locales.rb +91 -0
  70. data/lib/when_exe/locales/lt.rb +111 -0
  71. data/lib/when_exe/locales/lv.rb +118 -0
  72. data/lib/when_exe/locales/mk.rb +93 -0
  73. data/lib/when_exe/locales/mn.rb +80 -0
  74. data/lib/when_exe/locales/nb.rb +81 -0
  75. data/lib/when_exe/locales/ne.rb +81 -0
  76. data/lib/when_exe/locales/nl.rb +92 -0
  77. data/lib/when_exe/locales/nn.rb +73 -0
  78. data/lib/when_exe/locales/or.rb +84 -0
  79. data/lib/when_exe/locales/pl.rb +128 -0
  80. data/lib/when_exe/locales/pt.rb +88 -0
  81. data/lib/when_exe/locales/pt_BR.rb +88 -0
  82. data/lib/when_exe/locales/rm.rb +143 -0
  83. data/lib/when_exe/locales/ro.rb +105 -0
  84. data/lib/when_exe/locales/ru.rb +128 -0
  85. data/lib/when_exe/locales/sk.rb +109 -0
  86. data/lib/when_exe/locales/sl.rb +122 -0
  87. data/lib/when_exe/locales/sr.rb +122 -0
  88. data/lib/when_exe/locales/sv.rb +83 -0
  89. data/lib/when_exe/locales/sw.rb +89 -0
  90. data/lib/when_exe/locales/th.rb +78 -0
  91. data/lib/when_exe/locales/tl.rb +99 -0
  92. data/lib/when_exe/locales/tr.rb +96 -0
  93. data/lib/when_exe/locales/uk.rb +128 -0
  94. data/lib/when_exe/locales/uz.rb +128 -0
  95. data/lib/when_exe/locales/vi.rb +94 -0
  96. data/lib/when_exe/locales/wo.rb +82 -0
  97. data/lib/when_exe/locales/zh_CN.rb +77 -0
  98. data/lib/when_exe/locales/zh_HK.rb +77 -0
  99. data/lib/when_exe/locales/zh_TW.rb +77 -0
  100. data/lib/when_exe/mini_application.rb +252 -0
  101. data/lib/when_exe/parts/enumerator.rb +472 -0
  102. data/lib/when_exe/parts/geometric_complex.rb +379 -0
  103. data/lib/when_exe/parts/locale.rb +513 -0
  104. data/lib/when_exe/parts/method_cash.rb +207 -0
  105. data/lib/when_exe/parts/resource.rb +806 -0
  106. data/lib/when_exe/parts/timezone.rb +182 -0
  107. data/lib/when_exe/region/bahai.rb +145 -0
  108. data/lib/when_exe/region/balinese.rb +627 -0
  109. data/lib/when_exe/region/chinese.rb +896 -0
  110. data/lib/when_exe/region/chinese_calendar.rb +919 -0
  111. data/lib/when_exe/region/chinese_epoch.rb +1245 -0
  112. data/lib/when_exe/region/christian.rb +644 -0
  113. data/lib/when_exe/region/far_east.rb +192 -0
  114. data/lib/when_exe/region/french.rb +66 -0
  115. data/lib/when_exe/region/geologicalage.rb +639 -0
  116. data/lib/when_exe/region/indian.rb +1066 -0
  117. data/lib/when_exe/region/iranian.rb +66 -0
  118. data/lib/when_exe/region/islamic.rb +105 -0
  119. data/lib/when_exe/region/japanese.rb +851 -0
  120. data/lib/when_exe/region/japanese_notes.rb +964 -0
  121. data/lib/when_exe/region/japanese_residues.rb +1149 -0
  122. data/lib/when_exe/region/javanese.rb +228 -0
  123. data/lib/when_exe/region/jewish.rb +127 -0
  124. data/lib/when_exe/region/korean.rb +267 -0
  125. data/lib/when_exe/region/m17n.rb +115 -0
  126. data/lib/when_exe/region/martian.rb +215 -0
  127. data/lib/when_exe/region/mayan.rb +122 -0
  128. data/lib/when_exe/region/moon.rb +333 -0
  129. data/lib/when_exe/region/nihon_shoki.rb +73 -0
  130. data/lib/when_exe/region/planets.rb +585 -0
  131. data/lib/when_exe/region/pope.rb +298 -0
  132. data/lib/when_exe/region/residue.rb +229 -0
  133. data/lib/when_exe/region/roman.rb +325 -0
  134. data/lib/when_exe/region/ryukyu.rb +98 -0
  135. data/lib/when_exe/region/shire.rb +254 -0
  136. data/lib/when_exe/region/sun.rb +210 -0
  137. data/lib/when_exe/region/thai.rb +227 -0
  138. data/lib/when_exe/region/tibetan.rb +233 -0
  139. data/lib/when_exe/region/v50.rb +111 -0
  140. data/lib/when_exe/region/vietnamese.rb +173 -0
  141. data/lib/when_exe/region/world.rb +197 -0
  142. data/lib/when_exe/timestandard.rb +547 -0
  143. data/lib/when_exe/tmduration.rb +330 -330
  144. data/lib/when_exe/tmobjects.rb +1295 -0
  145. data/lib/when_exe/tmposition.rb +1955 -0
  146. data/lib/when_exe/tmreference.rb +1547 -0
  147. data/lib/when_exe/version.rb +10 -3
  148. data/link_to_online_documents +4 -0
  149. data/test/examples/JapanHolidays.ics +456 -0
  150. data/test/examples/Millennium.ics +17 -0
  151. data/test/examples/NewYork.ics +61 -0
  152. data/test/examples/Residue.m17n +135 -0
  153. data/test/examples/Spatial.m17n +179 -0
  154. data/test/examples/Terms.m17n +39 -0
  155. data/test/examples/Test.ics +53 -0
  156. data/test/examples/USA-DST.ics +61 -0
  157. data/test/examples/geometric_complex.rb +41 -0
  158. data/test/examples/sample.xml +14 -0
  159. data/test/examples/today.rb +61 -0
  160. data/test/test.rb +54 -19
  161. data/test/test.rb.config +1 -0
  162. data/test/test/basictypes.rb +368 -0
  163. data/test/test/calendartypes.rb +57 -0
  164. data/test/test/coordinates.rb +380 -0
  165. data/test/test/ephemeris.rb +127 -0
  166. data/test/test/googlecalendar.rb +167 -0
  167. data/test/test/icalendar.rb +848 -0
  168. data/test/test/inspect.rb +115 -0
  169. data/test/test/parts.rb +480 -0
  170. data/test/test/region/chinese.rb +161 -0
  171. data/test/test/region/french.rb +33 -0
  172. data/test/test/region/geologicalage.rb +14 -0
  173. data/test/test/region/indian.rb +55 -0
  174. data/test/test/region/iran.rb +54 -0
  175. data/test/test/region/islamic.rb +18 -0
  176. data/test/test/region/japanese.rb +62 -0
  177. data/test/test/region/jewish.rb +61 -0
  178. data/test/test/region/m17n.rb +181 -0
  179. data/test/test/region/mayan.rb +78 -0
  180. data/test/test/region/moon.rb +14 -0
  181. data/test/test/region/planets.rb +14 -0
  182. data/test/test/region/residue.rb +123 -0
  183. data/test/test/region/sun.rb +14 -0
  184. data/test/test/region/thai.rb +94 -0
  185. data/test/test/region/tibetan.rb +30 -0
  186. data/test/test/tmobjects.rb +356 -57
  187. data/test/test/tmposition.rb +237 -0
  188. data/test/test/tmreference.rb +95 -0
  189. data/when_exe.gemspec +2 -2
  190. metadata +187 -7
  191. data/doc/COPYING +0 -31
  192. data/doc/COPYING.ja +0 -25
  193. data/doc/document_url +0 -1
@@ -0,0 +1,547 @@
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2011-2013 Takashi SUGA
4
+
5
+ You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
+ =end
7
+
8
+ #
9
+ # 標準的な時刻系の定義
10
+ #
11
+ module When::TimeStandard
12
+
13
+ # TT(Terrestrial Time) - UTC(Universal Time, Coordinated) at 1970-01-01T00:00:00Z
14
+ DeltaT0 = (40 + 377.0/2048) * When::TM::Duration::SECOND
15
+
16
+ TAI_UTC = # http://maia.usno.navy.mil/ser7/tai-utc.dat
17
+ [[2437300.5, 1.422818, 37300.0, 0.001296 ],
18
+ [2437512.5, 1.372818, 37300.0, 0.001296 ],
19
+ [2437665.5, 1.845858, 37665.0, 0.0011232],
20
+ [2438334.5, 1.945858, 37665.0, 0.0011232],
21
+ [2438395.5, 3.24013, 38761.0, 0.001296 ],
22
+ [2438486.5, 3.34013, 38761.0, 0.001296 ],
23
+ [2438639.5, 3.44013, 38761.0, 0.001296 ],
24
+ [2438761.5, 3.54013, 38761.0, 0.001296 ],
25
+ [2438820.5, 3.64013, 38761.0, 0.001296 ],
26
+ [2438942.5, 3.74013, 38761.0, 0.001296 ],
27
+ [2439004.5, 3.84013, 38761.0, 0.001296 ],
28
+ [2439126.5, 4.31317, 39126.0, 0.002592 ],
29
+ [2439887.5, 4.21317, 39126.0, 0.002592 ],
30
+ [2441317.5, 10.0],
31
+ [2441499.5, 11.0],
32
+ [2441683.5, 12.0],
33
+ [2442048.5, 13.0],
34
+ [2442413.5, 14.0],
35
+ [2442778.5, 15.0],
36
+ [2443144.5, 16.0],
37
+ [2443509.5, 17.0],
38
+ [2443874.5, 18.0],
39
+ [2444239.5, 19.0],
40
+ [2444786.5, 20.0],
41
+ [2445151.5, 21.0],
42
+ [2445516.5, 22.0],
43
+ [2446247.5, 23.0],
44
+ [2447161.5, 24.0],
45
+ [2447892.5, 25.0],
46
+ [2448257.5, 26.0],
47
+ [2448804.5, 27.0],
48
+ [2449169.5, 28.0],
49
+ [2449534.5, 29.0],
50
+ [2450083.5, 30.0],
51
+ [2450630.5, 31.0],
52
+ [2451179.5, 32.0],
53
+ [2453736.5, 33.0],
54
+ [2454832.5, 34.0],
55
+ [2456109.5, 35.0]]
56
+
57
+ DeltaT = [ 142.00, # 1599
58
+
59
+ 141.00,140.00,139.00,139.00,139.00,139.00,139.00,140.00,140.00,141.00, # 1600-
60
+ 141.00,141.00,141.00,140.00,139.00,138.00,137.00,134.00,132.00,128.00, # 1610-
61
+ 124.00,119.00,115.00,110.00,106.00,102.00, 98.00, 95.00, 91.00, 88.00, # 1620-
62
+ 85.00, 82.00, 79.00, 77.00, 74.00, 72.00, 70.00, 67.00, 65.00, 63.00, # 1630-
63
+ 62.00, 60.00, 58.00, 57.00, 55.00, 54.00, 53.00, 51.00, 50.00, 49.00, # 1640-
64
+ 48.00, 47.00, 46.00, 45.00, 44.00, 43.00, 42.00, 41.00, 40.00, 38.00, # 1650-
65
+ 37.00, 36.00, 35.00, 34.00, 33.00, 32.00, 31.00, 30.00, 28.00, 27.00, # 1660-
66
+ 26.00, 25.00, 24.00, 23.00, 22.00, 21.00, 20.00, 19.00, 18.00, 17.00, # 1670-
67
+ 16.00, 15.00, 14.00, 14.00, 13.00, 12.00, 12.00, 11.00, 11.00, 10.00, # 1680-
68
+ 10.00, 10.00, 9.00, 9.00, 9.00, 9.00, 9.00, 9.00, 9.00, 9.00, # 1690-
69
+
70
+ 9.00, 9.00, 9.00, 9.00, 9.00, 9.00, 9.00, 9.00, 10.00, 10.00, # 1700-
71
+ 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 11.00, 11.00, 11.00, # 1710-
72
+ 11.00, 11.00, 11.00, 11.00, 11.00, 11.00, 11.00, 11.00, 11.00, 11.00, # 1720-
73
+ 11.00, 11.00, 11.00, 11.00, 12.00, 12.00, 12.00, 12.00, 12.00, 12.00, # 1730-
74
+ 12.00, 12.00, 12.00, 12.00, 13.00, 13.00, 13.00, 13.00, 13.00, 13.00, # 1740-
75
+ 13.00, 14.00, 14.00, 14.00, 14.00, 14.00, 14.00, 14.00, 15.00, 15.00, # 1750-
76
+ 15.00, 15.00, 15.00, 15.00, 15.00, 16.00, 16.00, 16.00, 16.00, 16.00, # 1760-
77
+ 16.00, 16.00, 16.00, 16.00, 16.00, 17.00, 17.00, 17.00, 17.00, 17.00, # 1770-
78
+ 17.00, 17.00, 17.00, 17.00, 17.00, 17.00, 17.00, 17.00, 17.00, 17.00, # 1780-
79
+ 17.00, 17.00, 16.00, 16.00, 16.00, 16.00, 15.00, 15.00, 14.00, 14.00, # 1790-
80
+
81
+ 13.70, 13.40, 13.10, 12.90, 12.70, 12.60, 12.50, 12.50, 12.50, 12.50, # 1800-
82
+ 12.50, 12.50, 12.50, 12.50, 12.50, 12.50, 12.50, 12.40, 12.30, 12.20, # 1810-
83
+ 12.00, 11.70, 11.40, 11.10, 10.60, 10.20, 9.60, 9.10, 8.60, 8.00, # 1820-
84
+ 7.50, 7.00, 6.60, 6.30, 6.00, 5.80, 5.70, 5.60, 5.60, 5.60, # 1830-
85
+ 5.70, 5.80, 5.90, 6.10, 6.20, 6.30, 6.50, 6.60, 6.80, 6.90, # 1840-
86
+ 7.10, 7.20, 7.30, 7.40, 7.50, 7.60, 7.70, 7.70, 7.80, 7.80, # 1850-
87
+ 7.88, 7.82, 7.54, 6.97, 6.40, 6.02, 5.41, 4.10, 2.92, 1.82, # 1860-
88
+ 1.61, 0.10, -1.02, -1.28, -2.69, -3.24, -3.64, -4.54, -4.71, -5.11, # 1870-
89
+ -5.40, -5.42, -5.20, -5.46, -5.46, -5.79, -5.63, -5.64, -5.80, -5.66, # 1880-
90
+ -5.87, -6.01, -6.19, -6.64, -6.44, -6.47, -6.09, -5.76, -4.66, -3.74, # 1890-
91
+
92
+ -2.72, -1.54, -0.02, 1.24, 2.64, 3.86, 5.37, 6.14, 7.75, 9.13, # 1900-
93
+ 10.46, 11.53, 13.36, 14.65, 16.01, 17.20, 18.24, 19.06, 20.25, 20.95, # 1910-
94
+ 21.16, 22.25, 22.41, 23.03, 23.49, 23.62, 23.86, 24.49, 24.34, 24.08, # 1920-
95
+ 24.02, 24.00, 23.87, 23.95, 23.86, 23.93, 23.73, 23.92, 23.96, 24.02, # 1930-
96
+ 24.33, 24.83, 25.30, 25.70, 26.24, 26.77, 27.28, 27.78, 28.25, 28.71, # 1940-
97
+ 29.15, 29.57, 29.97, 30.36, 30.72, 31.07, 31.35, 31.68, 32.18, 32.68, # 1950-
98
+ 33.15, 33.59, 34.00, 34.47, 35.03, 35.73, 36.54, 37.43, 38.29, 39.20, # 1960-
99
+ 40.18, 41.17, 42.23, 43.37, 44.49, 45.48, 46.46, 47.52, 48.53, 49.59, # 1970-
100
+ 50.54, 51.38, 52.17, 52.96, 53.79, 54.34, 54.87, 55.32, 55.82, 56.30, # 1980-
101
+ 56.86, 57.57, 58.31, 59.12, 59.99, 60.79, 61.63, 62.30, 62.97, 63.47, # 1990-
102
+
103
+ 63.83, 64.09, 64.30, 64.47, 64.57, 64.69, 64.85, 65.15, 65.46, 65.78, # 2000-
104
+ 66.07, 66.32, 66.60 # 2010-
105
+ ]
106
+
107
+ class << self
108
+ # When::TimeStandard Module のグローバルな設定を行う
109
+ #
110
+ # @param [String] leap_seconds http://maia.usno.navy.mil/ser7/tai-utc.dat 形式のファイルのファイルパス
111
+ # @param [Array<Array<Numeric>>] leap_seconds 閏秒の挿入記録 [ [ JD, TAI-UTC, (MJD, OFFSET) ] ]
112
+ # [ JD - 閏秒を挿入した日時のユリウス日 ]
113
+ # [ TAI-UTC - 閏秒を挿入後の TAI と UTC の差 ]
114
+ # [ MJD - 周波数オフセットの基準となる日時の修正ユリウス日 ]
115
+ # [ OFFSET - 周波数オフセット値 ]
116
+ #
117
+ # @return [void]
118
+ #
119
+ def _setup_(leap_seconds=nil)
120
+ @_lock_ = Mutex.new if When.multi_thread
121
+ @_lock_.lock if @_lock_
122
+ leap_seconds ||= TAI_UTC
123
+ @leap_seconds =
124
+ if leap_seconds.kind_of?(String)
125
+ OpenURI
126
+ open(leap_seconds) do |file|
127
+ file.read.split(/[\n\r]+/).map { |line|
128
+ line.split(/[^\d.]+/)[3..6].map {|d| d.to_f}
129
+ }.reverse
130
+ end
131
+ else
132
+ leap_seconds.reverse
133
+ end
134
+ @_lock_.unlock if @_lock_
135
+ end
136
+
137
+ # @private
138
+ # 閏秒の挿入記録を取得する
139
+ def _leap_seconds
140
+ @leap_seconds ||= TAI_UTC.reverse
141
+ end
142
+
143
+ # 処理系が閏秒を無視しているか否か
144
+ # @private
145
+ def _is_systemtime_universal?
146
+ @is_systemtime_universal = ((Time.utc(1976).to_i - Time.utc(1975).to_i) % 86400 == 0) if @is_systemtime_universal == nil
147
+ @is_systemtime_universal
148
+ end
149
+
150
+ # ΔT
151
+ #
152
+ # @param [Numeric] jd_utc ユリウス日(Universal Time, Coordinated)
153
+ #
154
+ # @return [Numeric] (dynamical_time - universal_time) / second
155
+ # 1/2048 second(≒0.5ms)未満を四捨五入
156
+ #
157
+ def delta_t(jd_utc)
158
+ (delta_t_coordinated(jd_utc) * 4096 + 1).floor / 4096.0
159
+ end
160
+ alias :deltaT :delta_t
161
+
162
+ # ΔT - 閏秒による(TT-UTC)
163
+ #
164
+ # @param [Numeric] jd_utc ユリウス日(Universal Time, Coordinated)
165
+ #
166
+ # @return [Numeric] (Terrestrial Time - Universal Time, Coordinated) / second
167
+ #
168
+ def delta_t_coordinated(jd_utc)
169
+ list = _leap_seconds
170
+ list.each do |v|
171
+ if jd_utc >= v[0]
172
+ result = 32.184 + v[1]
173
+ result += (jd_utc - (2400000.5 + v[2])) * v[3] unless (v[3]||0) == 0
174
+ return result
175
+ end
176
+ end
177
+ delta_t_observed(jd_utc)
178
+ end
179
+
180
+ # ΔT - 観測による(TT-UT1)
181
+ #
182
+ # @param [Numeric] jd_utc ユリウス日(Universal Time, Coordinated)
183
+ #
184
+ # @return [Numeric] (Terrestrial Time - Universal Time 1) / second
185
+ #
186
+ def delta_t_observed(jd_utc)
187
+ c2000 = (jd_utc - When::Ephemeris::EPOCH2000)/When::Ephemeris::JCENT # 2000年からの経過世紀
188
+ year = c2000 * 100.0 + 2000.0 # 0年からの経過年
189
+ i = (year-1599.0).floor # 1599年からの経過年(整数)
190
+ if year >= 2009.0
191
+ dt = 65.46 + 0.224 * (year-2009.0)
192
+ elsif i>0
193
+ n = year % 1
194
+ d0 = DeltaT[i+0] - DeltaT[i-1]
195
+ d1 = DeltaT[i+1] - DeltaT[i+0]
196
+ d2 = DeltaT[i+2] - DeltaT[i+1]
197
+ d10 = d1 - d0
198
+ d21 = d2 - d1
199
+ d210 = d21 - d10
200
+ dt = DeltaT[i] + n*d1 + n*(n-1.0)/4.0*(d10+d21) + n*(n-1.0)*(n-0.5)/6.0*d210
201
+ elsif year <948.0
202
+ dt = 2715.6 + 573.36 * c2000 + 46.5*c2000*c2000
203
+ else
204
+ dt = 50.6 + 67.5 * c2000 + 22.5*c2000*c2000
205
+ end
206
+ return dt
207
+ end
208
+
209
+ # universal time を dynamical time に変換する
210
+ #
211
+ # @param [Numeric] time universal time
212
+ #
213
+ # @return [Numeric] dynamical time
214
+ #
215
+ def to_dynamical_time(time)
216
+ return time unless -Float::MAX/4 < time && time < Float::MAX/4
217
+ jd_utc = When::TM::JulianDate._t_to_d(time * 1)
218
+ +time + delta_t(jd_utc) * When::TM::Duration::SECOND
219
+ end
220
+
221
+ # dynamical time を universal time に変換する
222
+ #
223
+ # @param [Numeric] time dynamical time
224
+ #
225
+ # @return [Numeric] universal time
226
+ #
227
+ def from_dynamical_time(time)
228
+ return time unless -Float::MAX/4 < time && time < Float::MAX/4
229
+ jd_tt = When::TM::JulianDate._t_to_d(time)
230
+ utc = time - delta_t(jd_tt) * When::TM::Duration::SECOND
231
+ diff = time - to_dynamical_time(utc)
232
+ return utc if diff == 0 # 間に閏秒なし
233
+ utc += diff
234
+ diff = time - to_dynamical_time(utc)
235
+ return utc if diff == 0 # 間に閏秒なし
236
+ return When::Coordinates::LeapSeconds.new(utc+diff, -diff, When::TM::Duration::SECOND)
237
+ end
238
+
239
+ # Time オブジェクトを dynamical time に変換する
240
+ #
241
+ # @param [::Time] time
242
+ #
243
+ # @return [Numeric] [dynamical time
244
+ #
245
+ def from_time_object(time)
246
+ time = time.to_f * When::TM::Duration::SECOND
247
+ _is_systemtime_universal? ? to_dynamical_time(time) : time + DeltaT0
248
+ end
249
+
250
+ # dynamical time を Time オブジェクトに変換する
251
+ #
252
+ # @param [Numeric] time dynamical time
253
+ #
254
+ # @return [::Time]
255
+ #
256
+ def to_time_object(time)
257
+ time = _is_systemtime_universal? ? from_dynamical_time(time) : time - DeltaT0
258
+ ::Time.at(+time / When::TM::Duration::SECOND)
259
+ end
260
+ end
261
+
262
+ #
263
+ # 時刻系のひながた
264
+ #
265
+ class TimeStandard < When::BasicTypes::Object
266
+
267
+ include When::TimeStandard
268
+
269
+ Ratio = 1.0
270
+
271
+ # universal time を dynamical time に変換する
272
+ #
273
+ # @param [Numeric] time universal time
274
+ #
275
+ # @return [Numeric] dynamical time
276
+ #
277
+ def to_dynamical_time(time)
278
+ When::TimeStandard.to_dynamical_time(time)
279
+ end
280
+
281
+ # dynamical time を universal time に変換する
282
+ #
283
+ # @param [Numeric] time dynamical time
284
+ #
285
+ # @return [Numeric] universal time
286
+ #
287
+ def from_dynamical_time(time)
288
+ When::TimeStandard.from_dynamical_time(time)
289
+ end
290
+
291
+ # 当該時刻系の日付を dynamical date に変換する
292
+ #
293
+ # @param [Numeric] date 当該時刻系の日付
294
+ #
295
+ # @return [Numeric] dynamical date
296
+ #
297
+ def to_dynamical_date(date)
298
+ When::TM::JulianDate._t_to_d(
299
+ to_dynamical_time(
300
+ When::TM::JulianDate._d_to_t(date)))
301
+ end
302
+
303
+ # dynamical date を当該時刻系の日付に変換する
304
+ #
305
+ # @param [Numeric] date dynamical date
306
+ #
307
+ # @return [Numeric] 当該時刻系の日付
308
+ #
309
+ def from_dynamical_date(date)
310
+ When::TM::JulianDate._t_to_d(
311
+ from_dynamical_time(
312
+ When::TM::JulianDate._d_to_t(date)))
313
+ end
314
+
315
+ # Time オブジェクトを universal time に変換する
316
+ #
317
+ # @param [::Time] time
318
+ #
319
+ # @return [Numeric] universal time
320
+ #
321
+ def from_time_object(time)
322
+ from_dynamical_time(When::TimeStandard.from_time_object(time))
323
+ end
324
+
325
+ # universal time を Time オブジェクトに変換する
326
+ #
327
+ # @param [Numeric] time universal time
328
+ #
329
+ # @return [::Time]
330
+ #
331
+ def to_time_object(time)
332
+ When::TimeStandard.to_time_object(to_dynamical_time(time))
333
+ end
334
+
335
+ # 当該時刻系に閏秒があるか?
336
+ #
337
+ # @return [Boolean] - false 閏秒なし
338
+ #
339
+ def has_leap?
340
+ false
341
+ end
342
+
343
+ # 時間の歩度
344
+ #
345
+ # @return [Numeric]
346
+ #
347
+ def rate_of_clock
348
+ self.class::Ratio
349
+ end
350
+
351
+ private
352
+
353
+ def _normalize(args=[], options={})
354
+ end
355
+ end
356
+
357
+ #
358
+ # 協定世界時
359
+ #
360
+ class UniversalTime < TimeStandard
361
+
362
+ # Time オブジェクトを universal time に変換する
363
+ #
364
+ # @param [::Time] time
365
+ #
366
+ # @return [Numeric] universal time
367
+ #
368
+ def from_time_object(time)
369
+ result = time.to_f * When::TM::Duration::SECOND
370
+ return result if When::TimeStandard._is_systemtime_universal?
371
+ from_dynamical_time(result + DeltaT0)
372
+ end
373
+
374
+ # universal time を Time オブジェクトに変換する
375
+ #
376
+ # @param [Numeric] time universal time
377
+ #
378
+ # @return [::Time]
379
+ #
380
+ def to_time_object(time)
381
+ time = to_dynamical_time(time) - DeltaT0 unless When::TimeStandard._is_systemtime_universal?
382
+ ::Time.at(+time / When::TM::Duration::SECOND)
383
+ end
384
+
385
+ # 当該時刻系に閏秒があるか?
386
+ #
387
+ # @return [Boolean] - true 閏秒あり
388
+ #
389
+ def has_leap?
390
+ true
391
+ end
392
+ end
393
+
394
+ #
395
+ # 地方平均太陽時
396
+ #
397
+ class LocalMeanTime < TimeStandard
398
+
399
+ # local mean time を dynamical time に変換する
400
+ #
401
+ # @param [Numeric] time local mean time
402
+ #
403
+ # @return [Numeric] dynamical time
404
+ #
405
+ def to_dynamical_time(time)
406
+ super(time - When::TM::Duration::DAY * @location.long / (360.0 * When::Coordinates::Spatial::DEGREE))
407
+ end
408
+
409
+ # dynamical time を local mean time に変換する
410
+ #
411
+ # @param [Numeric] time dynamical time
412
+ #
413
+ # @return [Numeric] local mean time
414
+ #
415
+ def from_dynamical_time(time)
416
+ super(time) + When::TM::Duration::DAY * @location.long / (360.0 * When::Coordinates::Spatial::DEGREE)
417
+ end
418
+
419
+ private
420
+
421
+ # オブジェクトの正規化
422
+ def _normalize(args=[], options={})
423
+ @location = When.Resource(@location || '_l:long=0&lat=0')
424
+ super
425
+ end
426
+ end
427
+
428
+ #
429
+ # 地方真太陽時
430
+ #
431
+ class LocalApparentTime < TimeStandard
432
+
433
+ # local apparent time を dynamical time に変換する
434
+ #
435
+ # @param [Numeric] time local apparent time
436
+ #
437
+ # @return [Numeric] dynamical time
438
+ #
439
+ def to_dynamical_time(time)
440
+ date = When::TM::JulianDate._t_to_d(time) - @location.long / (360.0 * When::Coordinates::Spatial::DEGREE)
441
+ diff = 0
442
+ 2.times do
443
+ diff = @datum.equation_of_time(date-diff)
444
+ end
445
+ super(When::TM::JulianDate._d_to_t(date-diff))
446
+ end
447
+
448
+ # dynamical time を local apparent time に変換する
449
+ #
450
+ # @param [Numeric] time dynamical time
451
+ #
452
+ # @return [Numeric] local apparent time
453
+ #
454
+ def from_dynamical_time(time)
455
+ super(time) + When::TM::Duration::DAY * @datum.equation_of_time(When::TM::JulianDate._t_to_d(time))
456
+ end
457
+
458
+ private
459
+
460
+ # オブジェクトの正規化
461
+ def _normalize(args=[], options={})
462
+ @location ||= '_l:long=0&lat=0'
463
+ @location = When.Resource(@location.gsub(/%26/, '&')) if @location.kind_of?(String)
464
+ @datum = When.Resource(@datum || '_ep:Earth' )
465
+ super
466
+ end
467
+ end
468
+
469
+ #
470
+ # 不定時法
471
+ #
472
+ class TemporalHourSystem < LocalApparentTime
473
+
474
+ # @private
475
+ alias :_to_dynamical_time :to_dynamical_time
476
+ # @private
477
+ alias :_from_dynamical_time :from_dynamical_time
478
+
479
+ # temporal hour system を dynamical time に変換する
480
+ #
481
+ # @param [Numeric] time temporal hour system
482
+ #
483
+ # @return [Numeric] dynamical time
484
+ #
485
+ def to_dynamical_time(time)
486
+ noon, frac = When::TM::JulianDate._t_to_d(time).divmod(1)
487
+
488
+ r, *p =
489
+ case (frac * 4).floor
490
+ when 3 ; [-1.5, [noon+1, -1],[noon+1, +1]] # morning
491
+ when 0 ; [+0.5, [noon, -1],[noon, +1]] # afternoon
492
+ else ; [-0.5, [noon, +1],[noon+1, -1]] # night
493
+ end
494
+
495
+ s, e = p.map {|v|
496
+ When::TM::JulianDate._d_to_t(@formula.day_event(_to_dynamical_date(v[0]), v[1], When.Resource('_ep:Sun'), @height))
497
+ }
498
+
499
+ s + (e - s) * (frac * 2 + r)
500
+ end
501
+
502
+ # dynamical time を temporal hour system に変換する
503
+ #
504
+ # @param [Numeric] time dynamical time
505
+ #
506
+ # @return [Numeric] temporal hour system
507
+ #
508
+ def from_dynamical_time(time)
509
+ date = When::TM::JulianDate._t_to_d(time)
510
+
511
+ d, t = [-1, +1].map {|v| @formula.day_event(date, v, When.Resource('_ep:Sun'), @height)}
512
+
513
+ if date < d # after midnight
514
+ t = @formula.sun_set(date-1, @height)
515
+ f = (date - t) / (d - t) / 2 - 0.25
516
+
517
+ elsif date > t # before midnight
518
+ d = @formula.sun_rise(date+1, @height)
519
+ f = (date - t) / (d - t) / 2 - 0.25
520
+
521
+ else # day time
522
+ f = (date - d) / (t - d) / 2 + 0.25
523
+ end
524
+
525
+ When::TM::JulianDate._d_to_t(_from_dynamical_date(d).floor + 0.5 + f)
526
+ end
527
+
528
+ private
529
+
530
+ # オブジェクトの正規化
531
+ def _normalize(args=[], options={})
532
+ @formula = When::Ephemeris::Formula.new({:location=>@location})
533
+ @height ||= 'T'
534
+ super
535
+ end
536
+
537
+ # 単位を「日」にした to_dynamical_time
538
+ def _to_dynamical_date(date)
539
+ When::TM::JulianDate._t_to_d(_to_dynamical_time(When::TM::JulianDate._d_to_t(date)))
540
+ end
541
+
542
+ # 単位を「日」にした from_dynamical_time
543
+ def _from_dynamical_date(date)
544
+ When::TM::JulianDate._t_to_d(_from_dynamical_time(When::TM::JulianDate._d_to_t(date)))
545
+ end
546
+ end
547
+ end