when_exe 0.3.7 → 0.3.8
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.
- checksums.yaml +4 -4
- data/README.md +210 -171
- data/bin/irb.rc +1 -0
- data/lib/when_exe.rb +78 -53
- data/lib/when_exe/basictypes.rb +27 -8
- data/lib/when_exe/calendarnote.rb +848 -805
- data/lib/when_exe/calendartypes.rb +110 -240
- data/lib/when_exe/coordinates.rb +2440 -2175
- data/lib/when_exe/core/compatibility.rb +1 -1
- data/lib/when_exe/core/duration.rb +13 -11
- data/lib/when_exe/core/extension.rb +38 -45
- data/lib/when_exe/ephemeris.rb +43 -14
- data/lib/when_exe/ephemeris/eclipse.rb +149 -0
- data/lib/when_exe/ephemeris/notes.rb +39 -7
- data/lib/when_exe/icalendar.rb +2 -6
- data/lib/when_exe/inspect.rb +1408 -1399
- data/lib/when_exe/parts/enumerator.rb +486 -477
- data/lib/when_exe/parts/resource.rb +1101 -1069
- data/lib/when_exe/parts/timezone.rb +6 -5
- data/lib/when_exe/region/babylonian.rb +405 -405
- data/lib/when_exe/region/bahai.rb +21 -61
- data/lib/when_exe/region/chinese/epochs.rb +81 -81
- data/lib/when_exe/region/chinese/twins.rb +51 -51
- data/lib/when_exe/region/christian.rb +7 -2
- data/lib/when_exe/region/coptic.rb +1 -1
- data/lib/when_exe/region/discordian.rb +9 -16
- data/lib/when_exe/region/french.rb +1 -1
- data/lib/when_exe/region/hanke_henry.rb +57 -0
- data/lib/when_exe/region/indian.rb +41 -73
- data/lib/when_exe/region/international_fixed.rb +97 -0
- data/lib/when_exe/region/iranian.rb +203 -203
- data/lib/when_exe/region/japanese.rb +13 -13
- data/lib/when_exe/region/japanese/eclipses.rb +1194 -0
- data/lib/when_exe/region/japanese/notes.rb +1482 -1383
- data/lib/when_exe/region/japanese/residues.rb +726 -721
- data/lib/when_exe/region/japanese/twins.rb +37 -37
- data/lib/when_exe/region/jewish.rb +2 -2
- data/lib/when_exe/region/pax.rb +60 -0
- data/lib/when_exe/region/positivist.rb +100 -0
- data/lib/when_exe/region/roman.rb +333 -334
- data/lib/when_exe/region/shire.rb +3 -20
- data/lib/when_exe/region/thai.rb +2 -2
- data/lib/when_exe/region/tibetan.rb +3 -3
- data/lib/when_exe/region/tranquility.rb +208 -0
- data/lib/when_exe/region/vanishing_leprechaun.rb +53 -0
- data/lib/when_exe/region/vietnamese.rb +4 -4
- data/lib/when_exe/region/world.rb +9 -13
- data/lib/when_exe/region/world_season.rb +89 -0
- data/lib/when_exe/region/zoroastrian.rb +4 -2
- data/lib/when_exe/tmobjects.rb +14 -4
- data/lib/when_exe/tmposition.rb +239 -81
- data/lib/when_exe/tmreference.rb +57 -28
- data/lib/when_exe/version.rb +1 -1
- data/link_to_online_documents +6 -3
- data/test/examples/today.rb +1 -1
- data/test/scripts.rb +23 -0
- data/test/scripts/2.ext.rb +169 -0
- data/test/scripts/2.rb +169 -0
- data/test/scripts/3.ext.rb +133 -0
- data/test/scripts/3.rb +134 -0
- data/test/scripts/4.ext.rb +112 -0
- data/test/scripts/4.min.rb +65 -0
- data/test/scripts/4.rb +136 -0
- data/test/scripts/5.ext.rb +78 -0
- data/test/scripts/5.rb +81 -0
- data/test/scripts/6.gcal.rb +131 -0
- data/test/scripts/6.rb +205 -0
- data/test/scripts/6.tz.rb +105 -0
- data/test/scripts/7.phase.rb +109 -0
- data/test/scripts/7.rb +95 -0
- data/test/scripts/7.term.rb +128 -0
- data/test/scripts/7.week.rb +84 -0
- data/test/scripts/8.ext.rb +61 -0
- data/test/scripts/8.rb +62 -0
- data/test/scripts/9.ext.rb +131 -0
- data/test/scripts/9.rb +130 -0
- data/test/scripts/chinese-luni-solar.rb +52 -0
- data/test/{examples → scripts}/geometric_complex.rb +41 -41
- data/test/scripts/geometric_complex.txt +18 -0
- data/test/scripts/korea.rb +59 -0
- data/test/scripts/thai-reviewed.txt +211 -0
- data/test/scripts/thai.rb +36 -0
- data/test/scripts/thai.txt +210 -0
- data/test/test.rb +7 -0
- data/test/test/basictypes.rb +22 -0
- data/test/test/coordinates.rb +2 -1
- data/test/test/ephemeris.rb +34 -2
- data/test/test/icalendar.rb +12 -0
- data/test/test/inspect.rb +37 -1
- data/test/test/parts.rb +4 -3
- data/test/test/region/armenian.rb +20 -0
- data/test/test/region/bahai.rb +58 -0
- data/test/test/region/chinese.rb +14 -3
- data/test/test/region/christian.rb +16 -35
- data/test/test/region/discordian.rb +20 -0
- data/test/test/region/indian.rb +30 -2
- data/test/test/region/japanese.rb +24 -0
- data/test/test/region/jewish.rb +2 -0
- data/test/test/region/m17n.rb +9 -0
- data/test/test/region/reforms.rb +121 -0
- data/test/test/region/residue.rb +17 -11
- data/test/test/region/shire.rb +58 -0
- data/test/test/region/swedish.rb +45 -0
- data/test/test/region/zoroastrian.rb +58 -0
- data/test/test/tmobjects.rb +74 -0
- data/test/test/tmposition.rb +468 -397
- data/when_exe.gemspec +2 -2
- metadata +49 -6
|
@@ -86,7 +86,18 @@ module When::CalendarTypes
|
|
|
86
86
|
def universal_time(sdn=nil)
|
|
87
87
|
return super - @time_standard.localtime_difference unless sdn
|
|
88
88
|
time = When::TM::JulianDate._d_to_t(sdn-0.5)
|
|
89
|
-
@time_standard.to_dynamical_time(time) - When::TimeStandard.to_dynamical_time(time)
|
|
89
|
+
@time_standard.to_dynamical_time(time) - When::TimeStandard.to_dynamical_time(time)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# この時法の時刻を128秒単位の実数に変換する
|
|
93
|
+
#
|
|
94
|
+
# @param [Array<Numeric>] clk_time
|
|
95
|
+
# @param [Integer] sdn 参照事象の通し番号(ダミー)
|
|
96
|
+
#
|
|
97
|
+
# @return [Numeric]
|
|
98
|
+
#
|
|
99
|
+
def to_local_time(clk_time, sdn=nil)
|
|
100
|
+
super - universal_time(sdn)
|
|
90
101
|
end
|
|
91
102
|
|
|
92
103
|
#
|
|
@@ -177,13 +188,13 @@ module When::CalendarTypes
|
|
|
177
188
|
'rule_table' => table
|
|
178
189
|
}
|
|
179
190
|
list = ''
|
|
180
|
-
while range.include?(date[YEAR])
|
|
181
|
-
month = date[MONTH] * 1
|
|
191
|
+
while range.include?(date[When::YEAR])
|
|
192
|
+
month = date[When::MONTH] * 1
|
|
182
193
|
char = Pattern[month..month]
|
|
183
|
-
char = char.downcase unless date.length(MONTH) == length
|
|
194
|
+
char = char.downcase unless date.length(When::MONTH) == length
|
|
184
195
|
list += char
|
|
185
196
|
succ = date + duration
|
|
186
|
-
unless date[YEAR] == succ[YEAR]
|
|
197
|
+
unless date[When::YEAR] == succ[When::YEAR]
|
|
187
198
|
table << list
|
|
188
199
|
list = ''
|
|
189
200
|
end
|
|
@@ -845,7 +856,7 @@ module When::CalendarTypes
|
|
|
845
856
|
|
|
846
857
|
# オブジェクトの正規化
|
|
847
858
|
#
|
|
848
|
-
#
|
|
859
|
+
# PatternTableBasedLuniSolarWithEphemeris オブジェクトの性質定義を初期設定します。
|
|
849
860
|
#
|
|
850
861
|
def _normalize(args=[], options={})
|
|
851
862
|
@engine = When.Calendar(@engine)
|
|
@@ -1050,20 +1061,56 @@ module When::CalendarTypes
|
|
|
1050
1061
|
end
|
|
1051
1062
|
|
|
1052
1063
|
#
|
|
1053
|
-
#
|
|
1064
|
+
# 年初を太陽黄経または別の暦で決定する暦
|
|
1054
1065
|
#
|
|
1055
1066
|
class YearLengthTableBased < TableBased
|
|
1056
1067
|
|
|
1068
|
+
module CalendarBased
|
|
1069
|
+
|
|
1070
|
+
# 年初の通日(別の暦使用)
|
|
1071
|
+
#
|
|
1072
|
+
# @param [Numeric] year 年
|
|
1073
|
+
#
|
|
1074
|
+
# @return [Integer] 年初の通日
|
|
1075
|
+
#
|
|
1076
|
+
def _new_year_sdn(year)
|
|
1077
|
+
@engine._coordinates_to_number(year + @diff_to_CE - @engine.diff_to_CE, @engine_month, @engine_day)
|
|
1078
|
+
end
|
|
1079
|
+
|
|
1080
|
+
# オブジェクトの正規化
|
|
1081
|
+
def _normalize_engine
|
|
1082
|
+
Rational
|
|
1083
|
+
@engine_month = @engine_month ? @engine_month.to_i - @indices[-2].base : 0
|
|
1084
|
+
@engine_day = @engine_day ? @engine_day.to_i - @indices[-1].base : 0
|
|
1085
|
+
@engine = When.Calendar(@engine || When::Gregorian)
|
|
1086
|
+
end
|
|
1087
|
+
end
|
|
1088
|
+
|
|
1057
1089
|
# 天体暦アルゴリズム
|
|
1058
1090
|
#
|
|
1059
1091
|
# @return [Array<When::Ephemeris::Formula>]
|
|
1060
1092
|
#
|
|
1061
1093
|
attr_reader :formula
|
|
1062
1094
|
|
|
1063
|
-
#protected
|
|
1064
|
-
|
|
1065
1095
|
private
|
|
1066
1096
|
|
|
1097
|
+
# 年初の通日(天体暦使用)
|
|
1098
|
+
#
|
|
1099
|
+
# @param [Numeric] year 年
|
|
1100
|
+
#
|
|
1101
|
+
# @return [Integer] 年初の通日
|
|
1102
|
+
#
|
|
1103
|
+
def _new_year_sdn(year)
|
|
1104
|
+
solar_sdn(@formula[0].cn_to_time(year.to_f + @cycle_offset) + @day_offset)
|
|
1105
|
+
end
|
|
1106
|
+
|
|
1107
|
+
# オブジェクトの正規化
|
|
1108
|
+
def _normalize_engine
|
|
1109
|
+
Rational
|
|
1110
|
+
@cycle_offset = (@cycle_offset||0).to_r
|
|
1111
|
+
@day_offset = (@day_offset||0).to_r
|
|
1112
|
+
end
|
|
1113
|
+
|
|
1067
1114
|
# 年初の通日
|
|
1068
1115
|
#
|
|
1069
1116
|
# @param [Array<Numeric>] date ( y )
|
|
@@ -1073,26 +1120,61 @@ module When::CalendarTypes
|
|
|
1073
1120
|
# @return [Integer] 年初の通日
|
|
1074
1121
|
#
|
|
1075
1122
|
def _sdn_(date)
|
|
1076
|
-
|
|
1077
|
-
t = @formula[0].cn_to_time(y.to_f + @cycle_offset)
|
|
1078
|
-
return solar_sdn(t + @day_offset)
|
|
1123
|
+
_new_year_sdn(+date[0])
|
|
1079
1124
|
end
|
|
1080
1125
|
|
|
1081
1126
|
# オブジェクトの正規化
|
|
1082
1127
|
#
|
|
1083
|
-
# YearLengthTableBased
|
|
1128
|
+
# YearLengthTableBased オブジェクトの性質定義を初期設定します。
|
|
1084
1129
|
#
|
|
1085
1130
|
def _normalize(args=[], options={})
|
|
1086
1131
|
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
@day_offset = (@day_offset||0).to_r
|
|
1090
|
-
@formula = 'Formula?formula=1S'
|
|
1091
|
-
|
|
1132
|
+
extend CalendarBased unless @formula || @location || @long || @lat || @alt || @time_basis
|
|
1133
|
+
_normalize_engine
|
|
1092
1134
|
super
|
|
1093
1135
|
end
|
|
1094
1136
|
end
|
|
1095
1137
|
|
|
1138
|
+
#
|
|
1139
|
+
# 年初を特定の日の日の出で決定する暦
|
|
1140
|
+
#
|
|
1141
|
+
class TableBasedWithSunrise < YearLengthTableBased
|
|
1142
|
+
|
|
1143
|
+
# 年初の通日(天体暦使用)
|
|
1144
|
+
#
|
|
1145
|
+
# @param [Numeric] year 年
|
|
1146
|
+
#
|
|
1147
|
+
# @return [Integer] 年初の通日
|
|
1148
|
+
#
|
|
1149
|
+
def _new_year_sdn(year)
|
|
1150
|
+
event_time = @formula[0].cn_to_time(year.to_f + @cycle_offset)
|
|
1151
|
+
event_date = (event_time + 0.5 + @formula[0].long/360.0).floor
|
|
1152
|
+
sunset_time = @formula[0].sunrise(event_date)
|
|
1153
|
+
event_date -= 1 if sunrise_time > event_time
|
|
1154
|
+
event_date + @day_offset
|
|
1155
|
+
end
|
|
1156
|
+
end
|
|
1157
|
+
|
|
1158
|
+
#
|
|
1159
|
+
# 年初を特定の日の日の入りで決定する暦
|
|
1160
|
+
#
|
|
1161
|
+
class TableBasedWithSunset < YearLengthTableBased
|
|
1162
|
+
|
|
1163
|
+
# 年初の通日(天体暦使用)
|
|
1164
|
+
#
|
|
1165
|
+
# @param [Numeric] year 年
|
|
1166
|
+
#
|
|
1167
|
+
# @return [Integer] 年初の通日
|
|
1168
|
+
#
|
|
1169
|
+
def _new_year_sdn(year)
|
|
1170
|
+
event_time = @formula[0].cn_to_time(year.to_f + @cycle_offset)
|
|
1171
|
+
event_date = (event_time + 0.5 + @formula[0].long/360.0).floor
|
|
1172
|
+
sunset_time = @formula[0].sunset(event_date)
|
|
1173
|
+
event_date += 1 if sunset_time <= event_time
|
|
1174
|
+
event_date + @day_offset
|
|
1175
|
+
end
|
|
1176
|
+
end
|
|
1177
|
+
|
|
1096
1178
|
# 月日の配当が太陽または月の位置によって決定される暦
|
|
1097
1179
|
#
|
|
1098
1180
|
# Calendar based on the ephemeris of the Sun or the Moon
|
|
@@ -1154,13 +1236,13 @@ module When::CalendarTypes
|
|
|
1154
1236
|
#
|
|
1155
1237
|
def _length(date)
|
|
1156
1238
|
y, m = date
|
|
1157
|
-
if
|
|
1239
|
+
if m
|
|
1158
1240
|
# 指定した月に含まれる日の数を返します。
|
|
1159
1241
|
m += @months_in_year * +y
|
|
1160
|
-
|
|
1242
|
+
_new_month(m+1) - _new_month(m)
|
|
1161
1243
|
else
|
|
1162
1244
|
# 指定した年に含まれる月の数を返します。
|
|
1163
|
-
|
|
1245
|
+
@months_in_year
|
|
1164
1246
|
end
|
|
1165
1247
|
end
|
|
1166
1248
|
|
|
@@ -1175,7 +1257,7 @@ module When::CalendarTypes
|
|
|
1175
1257
|
def _sum_(date)
|
|
1176
1258
|
y, = date
|
|
1177
1259
|
m = @months_in_year * +y
|
|
1178
|
-
|
|
1260
|
+
_new_month(m+@months_in_year) - _new_month(m)
|
|
1179
1261
|
end
|
|
1180
1262
|
|
|
1181
1263
|
private
|
|
@@ -1206,7 +1288,7 @@ module When::CalendarTypes
|
|
|
1206
1288
|
# @return [Integer] 月初の通日
|
|
1207
1289
|
#
|
|
1208
1290
|
def _new_month_(m)
|
|
1209
|
-
|
|
1291
|
+
solar_sdn(@formula[0].cn_to_time(m + @cycle_offset))
|
|
1210
1292
|
end
|
|
1211
1293
|
|
|
1212
1294
|
private
|
|
@@ -1239,7 +1321,7 @@ module When::CalendarTypes
|
|
|
1239
1321
|
# @return [Integer] 月初の通日
|
|
1240
1322
|
#
|
|
1241
1323
|
def _new_month_(m)
|
|
1242
|
-
|
|
1324
|
+
lunar_sdn(@formula[-1].cn_to_time(m + @cycle_offset))
|
|
1243
1325
|
end
|
|
1244
1326
|
|
|
1245
1327
|
private
|
|
@@ -1307,13 +1389,13 @@ module When::CalendarTypes
|
|
|
1307
1389
|
#
|
|
1308
1390
|
def _length(date)
|
|
1309
1391
|
y, m = date
|
|
1310
|
-
if
|
|
1392
|
+
if m
|
|
1311
1393
|
# 指定した月に含まれる日の数を返します。
|
|
1312
1394
|
m += _new_year_month(+y)
|
|
1313
|
-
|
|
1395
|
+
_new_month(m+1) - _new_month(m)
|
|
1314
1396
|
else
|
|
1315
1397
|
# 指定した年に含まれる月の数を返します。
|
|
1316
|
-
|
|
1398
|
+
_ids([y]).length
|
|
1317
1399
|
end
|
|
1318
1400
|
end
|
|
1319
1401
|
|
|
@@ -1329,7 +1411,7 @@ module When::CalendarTypes
|
|
|
1329
1411
|
#
|
|
1330
1412
|
def _sum_(date)
|
|
1331
1413
|
y = +date[0]
|
|
1332
|
-
|
|
1414
|
+
_new_month(_new_year_month(y+1)) - _new_month(_new_year_month(y))
|
|
1333
1415
|
end
|
|
1334
1416
|
|
|
1335
1417
|
# 太陽月初の通日
|
|
@@ -1368,216 +1450,4 @@ module When::CalendarTypes
|
|
|
1368
1450
|
super
|
|
1369
1451
|
end
|
|
1370
1452
|
end
|
|
1371
|
-
|
|
1372
|
-
#
|
|
1373
|
-
# 日時要素の境界 - Border
|
|
1374
|
-
#
|
|
1375
|
-
class Border < When::TM::ReferenceSystem
|
|
1376
|
-
#
|
|
1377
|
-
# 境界の振舞
|
|
1378
|
-
#
|
|
1379
|
-
# @return [Numeric]
|
|
1380
|
-
#
|
|
1381
|
-
# Pair(-1,+1) - 暦年/暦日が進む(境界が前年/日にあり、境界後が当年/日の扱いになる)
|
|
1382
|
-
#
|
|
1383
|
-
# Pair( 0, 0) - 暦年/暦日が戻る(境界が当年/日にあり、境界前が前年/日の扱いになる)
|
|
1384
|
-
#
|
|
1385
|
-
def behavior
|
|
1386
|
-
@border[0]
|
|
1387
|
-
end
|
|
1388
|
-
|
|
1389
|
-
# 境界の取得
|
|
1390
|
-
#
|
|
1391
|
-
# @param [Array<Numeric>] date 境界を計算する年/日
|
|
1392
|
-
# @param [When::TM::ReferenceSystem] frame 使用する暦法/時法
|
|
1393
|
-
#
|
|
1394
|
-
# @return [Array<Numeric>] その年/日の境界
|
|
1395
|
-
#
|
|
1396
|
-
def border(date=[], frame=nil)
|
|
1397
|
-
last = date.length-1
|
|
1398
|
-
return @border if last<0
|
|
1399
|
-
bDate = date[0..last] + @border[(last+1)..-1]
|
|
1400
|
-
branch = @border[last] * 0
|
|
1401
|
-
bDate[last] = When::Coordinates::Pair.new(date[last] * 1, branch)
|
|
1402
|
-
return bDate
|
|
1403
|
-
end
|
|
1404
|
-
|
|
1405
|
-
# 境界の正規化
|
|
1406
|
-
#
|
|
1407
|
-
# @param [Array<Numeric>] date 境界を計算する年/日
|
|
1408
|
-
# @param [When::TM::ReferenceSystem] frame 使用する暦法/時法
|
|
1409
|
-
#
|
|
1410
|
-
# @return [Array<Numeric>] その年/日の境界
|
|
1411
|
-
#
|
|
1412
|
-
def _adjust_epoch(date, frame=nil)
|
|
1413
|
-
s_date = date.dup
|
|
1414
|
-
e_date = border([+date[0]], frame)
|
|
1415
|
-
branch = behavior * 0
|
|
1416
|
-
branch += 1 if (s_date[1..-1] <=> e_date[1..-1]) < 0
|
|
1417
|
-
s_date[0] = When::Coordinates::Pair.new(+s_date[0]-branch, branch)
|
|
1418
|
-
return s_date
|
|
1419
|
-
end
|
|
1420
|
-
|
|
1421
|
-
# 日付の補正
|
|
1422
|
-
# @private
|
|
1423
|
-
def _date_adjust(source)
|
|
1424
|
-
source
|
|
1425
|
-
end
|
|
1426
|
-
|
|
1427
|
-
private
|
|
1428
|
-
|
|
1429
|
-
# 要素の正規化
|
|
1430
|
-
def _normalize(args=[], options={})
|
|
1431
|
-
@border = When::Coordinates::Pair._en_pair_date_time(@border) if (@border.kind_of?(String))
|
|
1432
|
-
end
|
|
1433
|
-
end
|
|
1434
|
-
|
|
1435
|
-
#
|
|
1436
|
-
# 日時要素の境界 - 年/日によって、異なる境界を使用する場合
|
|
1437
|
-
#
|
|
1438
|
-
class MultiBorder < Border
|
|
1439
|
-
|
|
1440
|
-
#
|
|
1441
|
-
# 境界の配列
|
|
1442
|
-
# @return [Array<When::CalendarTypes::Border>]
|
|
1443
|
-
attr_reader :borders
|
|
1444
|
-
|
|
1445
|
-
#
|
|
1446
|
-
# 境界の振舞
|
|
1447
|
-
#
|
|
1448
|
-
# @return [Numeric]
|
|
1449
|
-
#
|
|
1450
|
-
# Pair(-1,+1) - 暦年/暦日が進む(境界が前年/日にあり、境界後が当年/日の扱いになる)
|
|
1451
|
-
#
|
|
1452
|
-
# Pair( 0, 0) - 暦年/暦日が戻る(境界が当年/日にあり、境界前が前年/日の扱いになる)
|
|
1453
|
-
#
|
|
1454
|
-
def behavior
|
|
1455
|
-
@borders[0][:border].behavior
|
|
1456
|
-
end
|
|
1457
|
-
|
|
1458
|
-
# 境界の取得
|
|
1459
|
-
#
|
|
1460
|
-
# @param [Array<Numeric>] date 境界を計算する年/日
|
|
1461
|
-
# @param [When::TM::ReferenceSystem] frame 使用する暦法/時法
|
|
1462
|
-
#
|
|
1463
|
-
# @return [Array<Numeric>] その年/日の境界
|
|
1464
|
-
#
|
|
1465
|
-
def border(date=[], frame=nil)
|
|
1466
|
-
last = date.length-1
|
|
1467
|
-
return @borders[0][:boder] if (last<0)
|
|
1468
|
-
@borders.each do |border|
|
|
1469
|
-
return border[:border].border(date, frame) if date[0] >= border[:key]
|
|
1470
|
-
end
|
|
1471
|
-
date[0..last]
|
|
1472
|
-
end
|
|
1473
|
-
|
|
1474
|
-
# 境界の正規化
|
|
1475
|
-
#
|
|
1476
|
-
# @param [Array<Numeric>] date 境界を計算する年/日
|
|
1477
|
-
# @param [When::TM::ReferenceSystem] frame 使用する暦法/時法
|
|
1478
|
-
#
|
|
1479
|
-
# @return [Array<Numeric>] その年/日の境界
|
|
1480
|
-
#
|
|
1481
|
-
def _adjust_epoch(date, frame=nil)
|
|
1482
|
-
@borders.each do |border|
|
|
1483
|
-
next unless date[0] >= border[:key]
|
|
1484
|
-
s_date = date.dup
|
|
1485
|
-
e_date = border[:border].border(date[0..0], frame)
|
|
1486
|
-
branch = border[:border].behavior * 0
|
|
1487
|
-
branch += 1 if ((s_date[1..-1] <=> e_date[1..-1]) < 0)
|
|
1488
|
-
s_date[0] = When::Coordinates::Pair.new(+s_date[0]-branch, branch)
|
|
1489
|
-
return s_date
|
|
1490
|
-
end
|
|
1491
|
-
date
|
|
1492
|
-
end
|
|
1493
|
-
|
|
1494
|
-
private
|
|
1495
|
-
|
|
1496
|
-
# 要素の正規化
|
|
1497
|
-
def _normalize(args=[], options={})
|
|
1498
|
-
if @borders.kind_of?(String)
|
|
1499
|
-
list = @borders.split(/(\(.+?\))/)
|
|
1500
|
-
list.shift if list[0]==''
|
|
1501
|
-
list.unshift(-Float::MAX) unless list[0] =~ /\(/
|
|
1502
|
-
list.push('0-1-1') if list[-1] =~ /\(/
|
|
1503
|
-
@borders = []
|
|
1504
|
-
loop do
|
|
1505
|
-
key, border, *list = list
|
|
1506
|
-
break unless key
|
|
1507
|
-
key = $1.to_i if key.kind_of?(String) && /\((.+?)\)/ =~ key
|
|
1508
|
-
border = "_c:Border?border=#{border}" unless border =~ /\A[A-Z_]/i
|
|
1509
|
-
border = When.Calendar(border)
|
|
1510
|
-
@borders << {:key=>key, :border=>border}
|
|
1511
|
-
end
|
|
1512
|
-
end
|
|
1513
|
-
@borders = @borders.sort_by {|border| -border[:key]}
|
|
1514
|
-
end
|
|
1515
|
-
end
|
|
1516
|
-
|
|
1517
|
-
#
|
|
1518
|
-
# 日時要素の境界 - 日の出,日の入り
|
|
1519
|
-
#
|
|
1520
|
-
class DayBorder < Border
|
|
1521
|
-
|
|
1522
|
-
# 境界の取得
|
|
1523
|
-
#
|
|
1524
|
-
# @param [Array<Numeric>] date 境界を計算する日
|
|
1525
|
-
# @param [When::TM::ReferenceSystem] clock 使用する時法
|
|
1526
|
-
#
|
|
1527
|
-
# @return [Array<Numeric>] その日の境界
|
|
1528
|
-
#
|
|
1529
|
-
# @note 属性 @event によって境界を計算する (see {When::Ephemeris::Formula#day_event})
|
|
1530
|
-
#
|
|
1531
|
-
def border(date=[], clock=When::UTC)
|
|
1532
|
-
return @border unless date[0] && clock.formula
|
|
1533
|
-
|
|
1534
|
-
time =
|
|
1535
|
-
clock._number_to_coordinates(clock.second *
|
|
1536
|
-
clock.time_standard.from_dynamical_time(
|
|
1537
|
-
When::TM::JulianDate._d_to_t(
|
|
1538
|
-
clock.formula.first.day_event(
|
|
1539
|
-
clock.time_standard.to_dynamical_date(date[0] + @border[0]*0), @event, When.Resource('_ep:Sun'), @height
|
|
1540
|
-
))))
|
|
1541
|
-
|
|
1542
|
-
time[0] += When::TM::JulianDate::JD19700101
|
|
1543
|
-
time[0] = When::Coordinates::Pair.new(time[0]-@border[0]*0, @border[0]*0) unless @border[0]*0 == 0
|
|
1544
|
-
clock._encode(time, false)
|
|
1545
|
-
end
|
|
1546
|
-
|
|
1547
|
-
# 日付の補正
|
|
1548
|
-
# @private
|
|
1549
|
-
def _date_adjust(source)
|
|
1550
|
-
source * 1 + @border[0] * 0
|
|
1551
|
-
end
|
|
1552
|
-
end
|
|
1553
|
-
|
|
1554
|
-
#
|
|
1555
|
-
# 日時要素の境界 - 日の出
|
|
1556
|
-
#
|
|
1557
|
-
class Sunrise < DayBorder
|
|
1558
|
-
|
|
1559
|
-
private
|
|
1560
|
-
|
|
1561
|
-
# 要素の正規化
|
|
1562
|
-
def _normalize(args=[], options={})
|
|
1563
|
-
@border = [0,0,0,0]
|
|
1564
|
-
@event = -1
|
|
1565
|
-
@height ||= '0'
|
|
1566
|
-
end
|
|
1567
|
-
end
|
|
1568
|
-
|
|
1569
|
-
#
|
|
1570
|
-
# 日時要素の境界 - 日の入り
|
|
1571
|
-
#
|
|
1572
|
-
class Sunset < DayBorder
|
|
1573
|
-
|
|
1574
|
-
private
|
|
1575
|
-
|
|
1576
|
-
# 要素の正規化
|
|
1577
|
-
def _normalize(args=[], options={})
|
|
1578
|
-
@border = [When::Coordinates::Pair.new(+1,-1),0,0,0]
|
|
1579
|
-
@event = +1
|
|
1580
|
-
@height ||= '0'
|
|
1581
|
-
end
|
|
1582
|
-
end
|
|
1583
1453
|
end
|