when_exe 0.3.7 → 0.3.8
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/lib/when_exe/tmreference.rb
CHANGED
@@ -154,6 +154,19 @@ module When::TM
|
|
154
154
|
@time_basis ? @time_basis.time_standard.rate_of_clock : 1.0
|
155
155
|
end
|
156
156
|
|
157
|
+
# 西暦との年次の相違(外部表現の0年に対応する西暦年) - additional attribute
|
158
|
+
#
|
159
|
+
# @return [Numeric]
|
160
|
+
#
|
161
|
+
attr_reader :epoch_in_CE
|
162
|
+
|
163
|
+
# 西暦との年次の相違(内部表現の0年に対応する西暦年) - additional attribute
|
164
|
+
#
|
165
|
+
# @return [Numeric]
|
166
|
+
#
|
167
|
+
# @private
|
168
|
+
attr_reader :diff_to_CE
|
169
|
+
|
157
170
|
# 日付と時刻をユリウス日(When::TM::JulianDate)に変換する
|
158
171
|
#
|
159
172
|
# @param [When::TM::CalDate] cal_date
|
@@ -199,7 +212,7 @@ module When::TM
|
|
199
212
|
if clock
|
200
213
|
clock = When.Clock(clock) if clock.kind_of?(String)
|
201
214
|
clock = clock._daylight(jdt.universal_time) if clock._need_validate
|
202
|
-
frac = clock.universal_time
|
215
|
+
frac = clock.universal_time(jdt.to_i)
|
203
216
|
sdn, time = (jdt.universal_time - frac).divmod(Duration::DAY)
|
204
217
|
cal_options[:clock] = clock
|
205
218
|
cal_date = to_cal_date(sdn.to_i + JulianDate::JD19700101)
|
@@ -293,6 +306,15 @@ module When::TM
|
|
293
306
|
_default_index_of_MSC
|
294
307
|
_normalize_temporal
|
295
308
|
@reference_frame ||= []
|
309
|
+
@epoch_in_CE ||=
|
310
|
+
if @diff_to_CE
|
311
|
+
@diff_to_CE = @diff_to_CE.to_i
|
312
|
+
@diff_to_CE - @origin_of_MSC
|
313
|
+
else
|
314
|
+
0
|
315
|
+
end
|
316
|
+
@epoch_in_CE = @epoch_in_CE.to_i
|
317
|
+
@diff_to_CE = @epoch_in_CE + @origin_of_MSC
|
296
318
|
end
|
297
319
|
end
|
298
320
|
|
@@ -549,12 +571,14 @@ module When::TM
|
|
549
571
|
# この時法の時刻を128秒単位の実数に変換する
|
550
572
|
#
|
551
573
|
# @param [Array<Numeric>] clk_time
|
574
|
+
# @param [Integer] sdn 参照事象の通し番号(ダミー)
|
552
575
|
#
|
553
576
|
# @return [Numeric]
|
554
577
|
#
|
555
|
-
def to_universal_time(clk_time)
|
578
|
+
def to_universal_time(clk_time, sdn=nil)
|
556
579
|
return _coordinates_to_number(_decode(clk_time)) / @second
|
557
580
|
end
|
581
|
+
alias :to_local_time :to_universal_time
|
558
582
|
|
559
583
|
# 128秒単位の実数をこの時法の時刻に変換する
|
560
584
|
#
|
@@ -1417,33 +1441,35 @@ module When::TM
|
|
1417
1441
|
|
1418
1442
|
# dating_system
|
1419
1443
|
@dating_system = (@epoch.map {|e| e.frame}).compact.uniq
|
1420
|
-
ancestors = hierarchy.inject(['']) {|list,era|
|
1421
|
-
list << list[-1] + '::' + era.label.to_s
|
1422
|
-
list
|
1423
|
-
}
|
1424
1444
|
|
1425
|
-
|
1426
|
-
|
1427
|
-
|
1428
|
-
|
1429
|
-
|
1430
|
-
|
1431
|
-
|
1432
|
-
|
1433
|
-
|
1434
|
-
|
1435
|
-
|
1436
|
-
|
1437
|
-
|
1438
|
-
|
1439
|
-
|
1440
|
-
(epoch.length-1).times do |i|
|
1441
|
-
epoch[i].frame.synchronize {
|
1442
|
-
range = When::Parts::GeometricComplex.new([[epoch[i],true], [epoch[i+1],false]])
|
1445
|
+
unless @child && @child.length>0
|
1446
|
+
ancestors = hierarchy.inject(['']) {|list,era|
|
1447
|
+
list << list[-1] + '::' + era.label.to_s
|
1448
|
+
list
|
1449
|
+
}
|
1450
|
+
if @epoch.length == 1
|
1451
|
+
epoch[0].frame.synchronize {
|
1452
|
+
range = When::Parts::GeometricComplex.new([[epoch[0],true]])
|
1453
|
+
ancestors.each do |ancestor|
|
1454
|
+
epoch[0].frame.domain[ancestor] |= range
|
1455
|
+
end
|
1456
|
+
} if epoch[0].frame
|
1457
|
+
elsif reverse?
|
1458
|
+
epoch[1].frame.synchronize {
|
1459
|
+
range = When::Parts::GeometricComplex.new([[epoch[1],true]], true)
|
1443
1460
|
ancestors.each do |ancestor|
|
1444
|
-
epoch[
|
1461
|
+
epoch[1].frame.domain[ancestor] |= range
|
1445
1462
|
end
|
1446
|
-
} if epoch[
|
1463
|
+
} if epoch[1].frame
|
1464
|
+
else
|
1465
|
+
(epoch.length-1).times do |i|
|
1466
|
+
epoch[i].frame.synchronize {
|
1467
|
+
range = When::Parts::GeometricComplex.new([[epoch[i],true], [epoch[i+1],false]])
|
1468
|
+
ancestors.each do |ancestor|
|
1469
|
+
epoch[i].frame.domain[ancestor] |= range
|
1470
|
+
end
|
1471
|
+
} if epoch[i].frame
|
1472
|
+
end
|
1447
1473
|
end
|
1448
1474
|
end
|
1449
1475
|
|
@@ -1663,8 +1689,11 @@ module When::TM
|
|
1663
1689
|
end
|
1664
1690
|
frame = epoch.frame
|
1665
1691
|
cal_date = frame.to_cal_date(sdn)
|
1666
|
-
|
1667
|
-
return epoch,
|
1692
|
+
options = {:frame=>frame}
|
1693
|
+
return epoch, CalDate.new(cal_date, options) unless clock
|
1694
|
+
options[:clock] = clock
|
1695
|
+
options[:location] = date.location if date.location
|
1696
|
+
return epoch, DateAndTime.new(cal_date, time+frac, options)
|
1668
1697
|
end
|
1669
1698
|
|
1670
1699
|
# 代表的な元期
|
data/lib/when_exe/version.rb
CHANGED
data/link_to_online_documents
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
See online documents.
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
code: <https://github.com/suchowan/when_exe> (Please see README.md)
|
3
|
+
demo: <http://hosi.org> (Preferences - <http://hosi.org/cookies>)
|
4
|
+
gems: <https://rubygems.org/gems/when_exe>
|
5
|
+
yard: <http://rubydoc.info/gems/when_exe/frames>
|
6
|
+
wiki: <http://www2u.biglobe.ne.jp/~suchowan/when_exe_wiki.html>(Japanese and machine translated English)
|
7
|
+
blog: <http://suchowan.at.webry.info/theme/a543700674.html> (Japanese)
|
data/test/examples/today.rb
CHANGED
data/test/scripts.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
=begin
|
4
|
+
Copyright (C) 2014 Takashi SUGA
|
5
|
+
|
6
|
+
You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
|
7
|
+
=end
|
8
|
+
|
9
|
+
Dir.glob('scripts/*.rb') do |script|
|
10
|
+
next if script =~ /6/ # iCalendar
|
11
|
+
log = script.sub(/\.rb$/, '.txt')
|
12
|
+
if FileTest.exist?(log)
|
13
|
+
File.open(log, 'r') do |io|
|
14
|
+
puts '%s : %s' % [`ruby #{script}` == io.read ? '=' : 'x', log.sub(/^scripts\//, '')]
|
15
|
+
end
|
16
|
+
else
|
17
|
+
File.open(log, 'w') do |io|
|
18
|
+
io.write(`ruby #{script}`)
|
19
|
+
puts '%s : %s' % ['+', log.sub(/^scripts\//, '')]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,169 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
=begin
|
3
|
+
Copyright (C) 2014 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
|
+
# Calendar/When/Ruby/2.APIの使用例/2.逆引き/コア拡張
|
9
|
+
|
10
|
+
# コアクラスを require 'when_exe/core/extension' で拡張した場合の記法を確認
|
11
|
+
|
12
|
+
# *準備
|
13
|
+
# when_exe Ruby 版の When モジュールを include する
|
14
|
+
require 'when_exe'
|
15
|
+
require 'when_exe/core/extension'
|
16
|
+
include When
|
17
|
+
|
18
|
+
# *日付
|
19
|
+
# **日付オブジェクトを作成する
|
20
|
+
date = [2013, 5,24].tm_pos
|
21
|
+
p date #=> 2013-05-24
|
22
|
+
|
23
|
+
# **日付オブジェクトを文字列に変換する
|
24
|
+
p date.to_s #=>"2013-05-24"
|
25
|
+
|
26
|
+
# **指定の日付が存在するかどうか調べる
|
27
|
+
p [2013, 2,29].tm_pos #=> 2013-03-01
|
28
|
+
p [2013, 2,29].tm_pos(:invalid=>:check) #=> nil
|
29
|
+
begin
|
30
|
+
p [2013, 2,29].tm_pos(:invalid=>:raise)
|
31
|
+
rescue => e
|
32
|
+
p e #=> ArgumentError: Specified date not found: [2013, 2, 29]
|
33
|
+
end
|
34
|
+
|
35
|
+
# **ユリウス日から日付オブジェクトを作成する
|
36
|
+
date = 2451941.tm_pos #=> 2001-01-31
|
37
|
+
p date #=> 2001-01-31
|
38
|
+
p date.to_i #=> 2451941
|
39
|
+
|
40
|
+
# **何日後、何日前の日付を求める
|
41
|
+
date = [2013, 1, 31].tm_pos
|
42
|
+
p date + P1D #=> 2013-02-01
|
43
|
+
p date + 1.day_period_duration #=> 2013-02-01
|
44
|
+
p date + 1 #=> 2013-02-01
|
45
|
+
p date.precision #=> 0
|
46
|
+
p date.succ #=> 2013-02-01
|
47
|
+
|
48
|
+
date = [2013, 2, 1].tm_pos
|
49
|
+
p date - P1D #=> 2013-01-31
|
50
|
+
p date - 1.day_period_duration #=> 2013-01-31
|
51
|
+
p date - 1 #=> 2013-01-31
|
52
|
+
p date.precision #=> 0
|
53
|
+
p date.prev #=> 2013-01-31
|
54
|
+
|
55
|
+
# 定数 P1D の値は &yard(When::TM::PeriodDuration,2).new(1, DAY) である
|
56
|
+
|
57
|
+
# 加減算で Integer は &yard(When::TM::PeriodDuration) に暗黙変換される
|
58
|
+
|
59
|
+
# **何ヶ月後、何ヶ月前の日付を求める
|
60
|
+
date = [2013, 1, 31].tm_pos
|
61
|
+
p date + P1M #=> 2013-02-28
|
62
|
+
p date + 1.month_period_duration #=> 2013-02-28
|
63
|
+
date = [2013, 1].tm_pos
|
64
|
+
p date.precision #=> -1
|
65
|
+
p date.succ #=> 2013-02
|
66
|
+
|
67
|
+
date = [2013, 3, 31].tm_pos
|
68
|
+
p date - P1M #=> 2013-02-28
|
69
|
+
p date - 1.month_period_duration #=> 2013-02-28
|
70
|
+
date = [2013, 2].tm_pos
|
71
|
+
p date.precision #=> -1
|
72
|
+
p date.prev #=> 2013-01
|
73
|
+
|
74
|
+
# 定数 P1M の値は &yard(When::TM::PeriodDuration).new(1, MONTH) である
|
75
|
+
|
76
|
+
# 日付の精度が“月”の場合、prev, succ は“月”単位で前後を求める
|
77
|
+
|
78
|
+
# **2つの日付の差を求める
|
79
|
+
date1 = [2012, 6,30].tm_pos
|
80
|
+
date2 = [2012, 7, 1].tm_pos
|
81
|
+
p date2 - date1 #=> P1D
|
82
|
+
p (date2 - date1).class #=> When::TM::PeriodDuration
|
83
|
+
|
84
|
+
# 精度が“日”または“日”よりも粗い日付の差は &yard(When::TM::PeriodDuration) になる
|
85
|
+
|
86
|
+
# **日付オブジェクトの年月日・曜日を個別に扱う
|
87
|
+
date = [2013, 5,24].tm_pos
|
88
|
+
p date #=> 2013-05-24
|
89
|
+
p date[YEAR] #=> 2013
|
90
|
+
p date[MONTH] #=> 5
|
91
|
+
p date[DAY] #=> 24
|
92
|
+
p date.year #=> 2013
|
93
|
+
p date.month #=> 5
|
94
|
+
p date.day #=> 24
|
95
|
+
p date.wday #=> 5
|
96
|
+
|
97
|
+
# **うるう年かどうか判定する
|
98
|
+
p date.length(YEAR) == 366 #=> false
|
99
|
+
|
100
|
+
# **文字列の日付を日付オブジェクトに変換する
|
101
|
+
p when?('2013-05-24') #=> 2013-05-24
|
102
|
+
|
103
|
+
# *日時
|
104
|
+
# **日時オブジェクトを生成する
|
105
|
+
time = [2013, 5,24, 6, 3, 10.5].tm_pos
|
106
|
+
p time #=> 2013-05-24T06:03:10.5Z
|
107
|
+
p time[YEAR] #=> 2013
|
108
|
+
p time[MONTH] #=> 5
|
109
|
+
p time[DAY] #=> 24
|
110
|
+
p time[HOUR] #=> 6
|
111
|
+
p time[MINUTE] #=> 3
|
112
|
+
p time[SECOND] #=> 10.5
|
113
|
+
p time.year #=> 2013
|
114
|
+
p time.month #=> 5
|
115
|
+
p time.day #=> 24
|
116
|
+
p time.hour #=> 6
|
117
|
+
p time.min #=> 3
|
118
|
+
p time.sec #=> 10.5
|
119
|
+
p time.wday #=> 5
|
120
|
+
|
121
|
+
# **日時中の曜日を日本語に変換する
|
122
|
+
p time.strftime('%A', 'ja') #=> "金曜日"
|
123
|
+
p ('Week'.residue % time).to_m17n/'ja' #=> "金曜日(4)"
|
124
|
+
|
125
|
+
# **UTCとローカル時刻の日時オブジェクト
|
126
|
+
utc = [2013, 5,24, 6, 3, 11].tm_pos
|
127
|
+
p utc #=> 2013-05-24T06:03:11Z
|
128
|
+
jst = [2013, 5,24, 6, 3, 11].tm_pos(:clock=>'+09:00')
|
129
|
+
p jst #=> 2013-05-24T06:03:11+09:00
|
130
|
+
|
131
|
+
# **日時オブジェクトを文字列に変換する
|
132
|
+
p jst.to_s #=> "2013-05-24T06:03:11+09:00"
|
133
|
+
|
134
|
+
# **日時を任意のフォーマットで扱う
|
135
|
+
p jst.strftime("Now, %A %B %d %X %Y", 'fr') #=> "Now, vendredi mai 24 06:03:11 2013"
|
136
|
+
|
137
|
+
# **日本時間をニューヨーク時間に変換する
|
138
|
+
if Object.const_defined?(:TZInfo) # TZInfo gem がインストールされていること
|
139
|
+
jst = [1997, 4, 6, 15, 30, 00].tm_pos(:tz=>'Asia/Tokyo')
|
140
|
+
p jst #=> 1997-04-06T15:30:00+09:00
|
141
|
+
est = 'America/New_York'.clock ^ jst
|
142
|
+
p est #=> 1997-04-06T01:30:00-05:00
|
143
|
+
jst = [1997, 4, 6, 16, 30, 00].tm_pos(:tz=>'Asia/Tokyo')
|
144
|
+
p jst #=> 1997-04-06T16:30:00+09:00
|
145
|
+
edt = 'America/New_York'.clock ^ jst
|
146
|
+
p edt #=> 1997-04-06T03:30:00-04:00
|
147
|
+
end
|
148
|
+
# 使用可能な時間帯の一覧は &yard(When::Parts::Timezone,2).tz_info.keys で取得できる
|
149
|
+
|
150
|
+
# **日時に任意の時間を加減する
|
151
|
+
utc = [2012, 6,30, 0, 0, 0].tm_pos
|
152
|
+
p utc #=> 2012-06-30T00:00:00Z
|
153
|
+
p utc + 1 #=> 2012-07-01T00:00:00Z
|
154
|
+
p utc + 1.0 #=> 2012-06-30T23:59:60Z
|
155
|
+
|
156
|
+
# 加減算で Integer は &yard(When::TM::PeriodDuration) に暗黙変換される
|
157
|
+
|
158
|
+
# 加減算で Float は &yard(When::TM::IntervalLength,2) に暗黙変換される
|
159
|
+
|
160
|
+
# **2つの日時の差を求める
|
161
|
+
utc1 = [2012, 6,30, 0, 0, 0].tm_pos
|
162
|
+
utc2 = [2012, 7, 1, 0, 0, 0].tm_pos
|
163
|
+
p utc2 - utc1 #=> 86401.0s
|
164
|
+
p (utc2 - utc1).class #=> When::TM::IntervalLength
|
165
|
+
|
166
|
+
# 精度が“日”よりも細かい日時の差は &yard(When::TM::IntervalLength) になる
|
167
|
+
|
168
|
+
# **UNIXタイムを日時オブジェクトに変換する
|
169
|
+
p when?(Time.at(1267867237)) #=> 2010-03-06T18:20:37.00+09:00
|
data/test/scripts/2.rb
ADDED
@@ -0,0 +1,169 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
=begin
|
3
|
+
Copyright (C) 2014 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
|
+
# Calendar/When/Ruby/2.APIの使用例/2.逆引き
|
9
|
+
|
10
|
+
# [[逆引きRuby>http://www.namaraii.com/rubytips/?%C6%FC%C9%D5%A4%C8%BB%FE%B9%EF]]の例を When_exe Ruby 版ではどうするか? 下記に列挙する
|
11
|
+
|
12
|
+
# *準備
|
13
|
+
# when_exe Ruby 版の When モジュールを include する
|
14
|
+
require 'when_exe'
|
15
|
+
include When
|
16
|
+
|
17
|
+
# コア拡張を利用する場合は[[Calendar/When/Ruby/2.APIの使用例/2.逆引き/コア拡張]]を参照
|
18
|
+
|
19
|
+
# *日付
|
20
|
+
# **日付オブジェクトを作成する
|
21
|
+
date = tm_pos(2013, 5,24)
|
22
|
+
p date #=> 2013-05-24
|
23
|
+
|
24
|
+
# **日付オブジェクトを文字列に変換する
|
25
|
+
p date.to_s #=>"2013-05-24"
|
26
|
+
|
27
|
+
# **指定の日付が存在するかどうか調べる
|
28
|
+
p tm_pos(2013, 2, 29) #=> 2013-03-01
|
29
|
+
p tm_pos(2013, 2, 29, :invalid=>:check) #=> nil
|
30
|
+
begin
|
31
|
+
p tm_pos(2013, 2, 29, :invalid=>:raise)
|
32
|
+
rescue => e
|
33
|
+
p e #=> ArgumentError: Specified date not found: [2013, 2, 29]
|
34
|
+
end
|
35
|
+
|
36
|
+
# **ユリウス日から日付オブジェクトを作成する
|
37
|
+
date = Calendar('Gregorian').jul_trans(2451941)
|
38
|
+
p date #=> 2001-01-31
|
39
|
+
p date.to_i #=> 2451941
|
40
|
+
|
41
|
+
date = Gregorian ^ 2451941 # Gregorian は定数として定義済み、^ は jul_trans の alias
|
42
|
+
p date #=> 2001-01-31
|
43
|
+
p date.to_i #=> 2451941
|
44
|
+
|
45
|
+
# **何日後、何日前の日付を求める
|
46
|
+
date = tm_pos(2013, 1, 31)
|
47
|
+
p date + P1D #=> 2013-02-01
|
48
|
+
p date + 1 #=> 2013-02-01
|
49
|
+
p date.precision #=> 0
|
50
|
+
p date.succ #=> 2013-02-01
|
51
|
+
|
52
|
+
date = tm_pos(2013, 2, 1)
|
53
|
+
p date - 1 #=> 2013-01-31
|
54
|
+
p date - P1D #=> 2013-01-31
|
55
|
+
p date.precision #=> 0
|
56
|
+
p date.prev #=> 2013-01-31
|
57
|
+
|
58
|
+
# 定数 P1D の値は &yard(When::TM::PeriodDuration,2).new(1, DAY) である
|
59
|
+
|
60
|
+
# 加減算で Integer は &yard(When::TM::PeriodDuration) に暗黙変換される
|
61
|
+
|
62
|
+
# **何ヶ月後、何ヶ月前の日付を求める
|
63
|
+
date = tm_pos(2013, 1, 31)
|
64
|
+
p date + P1M #=> 2013-02-28
|
65
|
+
date = tm_pos(2013, 1)
|
66
|
+
p date.precision #=> -1
|
67
|
+
p date.succ #=> 2013-02
|
68
|
+
|
69
|
+
date = tm_pos(2013, 3, 31)
|
70
|
+
p date - P1M #=> 2013-02-28
|
71
|
+
date = tm_pos(2013, 2)
|
72
|
+
p date.precision #=> -1
|
73
|
+
p date.prev #=> 2013-01
|
74
|
+
|
75
|
+
# 定数 P1M の値は &yard(When::TM::PeriodDuration).new(1, MONTH) である
|
76
|
+
|
77
|
+
# 日付の精度が“月”の場合、prev, succ は“月”単位で前後を求める
|
78
|
+
|
79
|
+
# **2つの日付の差を求める
|
80
|
+
date1 = tm_pos(2012, 6,30)
|
81
|
+
date2 = tm_pos(2012, 7, 1)
|
82
|
+
p date2 - date1 #=> P1D
|
83
|
+
p (date2 - date1).class #=> When::TM::PeriodDuration
|
84
|
+
|
85
|
+
# 精度が“日”または“日”よりも粗い日付の差は &yard(When::TM::PeriodDuration) になる
|
86
|
+
|
87
|
+
# **日付オブジェクトの年月日・曜日を個別に扱う
|
88
|
+
date = tm_pos(2013, 5, 24)
|
89
|
+
p date #=> 2013-05-24
|
90
|
+
p date[YEAR] #=> 2013
|
91
|
+
p date[MONTH] #=> 5
|
92
|
+
p date[DAY] #=> 24
|
93
|
+
p date.year #=> 2013
|
94
|
+
p date.month #=> 5
|
95
|
+
p date.day #=> 24
|
96
|
+
p date.wday #=> 5
|
97
|
+
|
98
|
+
# **うるう年かどうか判定する
|
99
|
+
p date.length(YEAR) == 366 #=> false
|
100
|
+
|
101
|
+
# **文字列の日付を日付オブジェクトに変換する
|
102
|
+
p when?('2013-05-24') #=> 2013-05-24
|
103
|
+
|
104
|
+
# *日時
|
105
|
+
# **日時オブジェクトを生成する
|
106
|
+
time = tm_pos(2013, 5,24, 6, 3, 10.5)
|
107
|
+
p time #=> 2013-05-24T06:03:10.5Z
|
108
|
+
p time[YEAR] #=> 2013
|
109
|
+
p time[MONTH] #=> 5
|
110
|
+
p time[DAY] #=> 24
|
111
|
+
p time[HOUR] #=> 6
|
112
|
+
p time[MINUTE] #=> 3
|
113
|
+
p time[SECOND] #=> 10.5
|
114
|
+
p time.year #=> 2013
|
115
|
+
p time.month #=> 5
|
116
|
+
p time.day #=> 24
|
117
|
+
p time.hour #=> 6
|
118
|
+
p time.min #=> 3
|
119
|
+
p time.sec #=> 10.5
|
120
|
+
p time.wday #=> 5
|
121
|
+
|
122
|
+
# **日時中の曜日を日本語に変換する
|
123
|
+
p time.strftime('%A', 'ja') #=> "金曜日"
|
124
|
+
|
125
|
+
# **UTCとローカル時刻の日時オブジェクト
|
126
|
+
utc = tm_pos(2013, 5,24, 6, 3, 11)
|
127
|
+
p utc #=> 2013-05-24T06:03:11Z
|
128
|
+
jst = tm_pos(2013, 5,24, 6, 3, 11, :clock=>'+09:00')
|
129
|
+
p jst #=> 2013-05-24T06:03:11+09:00
|
130
|
+
|
131
|
+
# **日時オブジェクトを文字列に変換する
|
132
|
+
p jst.to_s #=> "2013-05-24T06:03:11+09:00"
|
133
|
+
|
134
|
+
# **日時を任意のフォーマットで扱う
|
135
|
+
p jst.strftime("Now, %A %B %d %X %Y", 'fr') #=> "Now, vendredi mai 24 06:03:11 2013"
|
136
|
+
|
137
|
+
# **日本時間をニューヨーク時間に変換する
|
138
|
+
if Object.const_defined?(:TZInfo) # TZInfo gem がインストールされていること
|
139
|
+
jst = tm_pos(1997, 4, 6, 15, 30, 00, :tz=>'Asia/Tokyo')
|
140
|
+
p jst #=> 1997-04-06T15:30:00+09:00
|
141
|
+
est = Clock('America/New_York') ^ jst
|
142
|
+
p est #=> 1997-04-06T01:30:00-05:00
|
143
|
+
jst = tm_pos(1997, 4, 6, 16, 30, 00, :tz=>'Asia/Tokyo')
|
144
|
+
p jst #=> 1997-04-06T16:30:00+09:00
|
145
|
+
edt = Clock('America/New_York') ^ jst
|
146
|
+
p edt #=> 1997-04-06T03:30:00-04:00
|
147
|
+
end
|
148
|
+
# 使用可能な時間帯の一覧は &yard(When::Parts::Timezone,2).tz_info.keys で取得できる
|
149
|
+
|
150
|
+
# **日時に任意の時間を加減する
|
151
|
+
utc = tm_pos(2012, 6,30, 0, 0, 0)
|
152
|
+
p utc #=> 2012-06-30T00:00:00Z
|
153
|
+
p utc + 1 #=> 2012-07-01T00:00:00Z
|
154
|
+
p utc + 1.0 #=> 2012-06-30T23:59:60Z
|
155
|
+
|
156
|
+
# 加減算で Integer は &yard(When::TM::PeriodDuration) に暗黙変換される
|
157
|
+
|
158
|
+
# 加減算で Float は &yard(When::TM::IntervalLength) に暗黙変換される
|
159
|
+
|
160
|
+
# **2つの日時の差を求める
|
161
|
+
utc1 = tm_pos(2012, 6,30, 0, 0, 0)
|
162
|
+
utc2 = tm_pos(2012, 7, 1, 0, 0, 0)
|
163
|
+
p utc2 - utc1 #=> 86401.0s
|
164
|
+
p (utc2 - utc1).class #=> When::TM::IntervalLength
|
165
|
+
|
166
|
+
# 精度が“日”よりも細かい日時の差は &yard(When::TM::IntervalLength,2) になる
|
167
|
+
|
168
|
+
# **UNIXタイムを日時オブジェクトに変換する
|
169
|
+
p when?(Time.at(1267867237)) #=> 2010-03-06T18:20:37.00+09:00
|