when_exe 0.2.100 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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