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.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +210 -171
  3. data/bin/irb.rc +1 -0
  4. data/lib/when_exe.rb +78 -53
  5. data/lib/when_exe/basictypes.rb +27 -8
  6. data/lib/when_exe/calendarnote.rb +848 -805
  7. data/lib/when_exe/calendartypes.rb +110 -240
  8. data/lib/when_exe/coordinates.rb +2440 -2175
  9. data/lib/when_exe/core/compatibility.rb +1 -1
  10. data/lib/when_exe/core/duration.rb +13 -11
  11. data/lib/when_exe/core/extension.rb +38 -45
  12. data/lib/when_exe/ephemeris.rb +43 -14
  13. data/lib/when_exe/ephemeris/eclipse.rb +149 -0
  14. data/lib/when_exe/ephemeris/notes.rb +39 -7
  15. data/lib/when_exe/icalendar.rb +2 -6
  16. data/lib/when_exe/inspect.rb +1408 -1399
  17. data/lib/when_exe/parts/enumerator.rb +486 -477
  18. data/lib/when_exe/parts/resource.rb +1101 -1069
  19. data/lib/when_exe/parts/timezone.rb +6 -5
  20. data/lib/when_exe/region/babylonian.rb +405 -405
  21. data/lib/when_exe/region/bahai.rb +21 -61
  22. data/lib/when_exe/region/chinese/epochs.rb +81 -81
  23. data/lib/when_exe/region/chinese/twins.rb +51 -51
  24. data/lib/when_exe/region/christian.rb +7 -2
  25. data/lib/when_exe/region/coptic.rb +1 -1
  26. data/lib/when_exe/region/discordian.rb +9 -16
  27. data/lib/when_exe/region/french.rb +1 -1
  28. data/lib/when_exe/region/hanke_henry.rb +57 -0
  29. data/lib/when_exe/region/indian.rb +41 -73
  30. data/lib/when_exe/region/international_fixed.rb +97 -0
  31. data/lib/when_exe/region/iranian.rb +203 -203
  32. data/lib/when_exe/region/japanese.rb +13 -13
  33. data/lib/when_exe/region/japanese/eclipses.rb +1194 -0
  34. data/lib/when_exe/region/japanese/notes.rb +1482 -1383
  35. data/lib/when_exe/region/japanese/residues.rb +726 -721
  36. data/lib/when_exe/region/japanese/twins.rb +37 -37
  37. data/lib/when_exe/region/jewish.rb +2 -2
  38. data/lib/when_exe/region/pax.rb +60 -0
  39. data/lib/when_exe/region/positivist.rb +100 -0
  40. data/lib/when_exe/region/roman.rb +333 -334
  41. data/lib/when_exe/region/shire.rb +3 -20
  42. data/lib/when_exe/region/thai.rb +2 -2
  43. data/lib/when_exe/region/tibetan.rb +3 -3
  44. data/lib/when_exe/region/tranquility.rb +208 -0
  45. data/lib/when_exe/region/vanishing_leprechaun.rb +53 -0
  46. data/lib/when_exe/region/vietnamese.rb +4 -4
  47. data/lib/when_exe/region/world.rb +9 -13
  48. data/lib/when_exe/region/world_season.rb +89 -0
  49. data/lib/when_exe/region/zoroastrian.rb +4 -2
  50. data/lib/when_exe/tmobjects.rb +14 -4
  51. data/lib/when_exe/tmposition.rb +239 -81
  52. data/lib/when_exe/tmreference.rb +57 -28
  53. data/lib/when_exe/version.rb +1 -1
  54. data/link_to_online_documents +6 -3
  55. data/test/examples/today.rb +1 -1
  56. data/test/scripts.rb +23 -0
  57. data/test/scripts/2.ext.rb +169 -0
  58. data/test/scripts/2.rb +169 -0
  59. data/test/scripts/3.ext.rb +133 -0
  60. data/test/scripts/3.rb +134 -0
  61. data/test/scripts/4.ext.rb +112 -0
  62. data/test/scripts/4.min.rb +65 -0
  63. data/test/scripts/4.rb +136 -0
  64. data/test/scripts/5.ext.rb +78 -0
  65. data/test/scripts/5.rb +81 -0
  66. data/test/scripts/6.gcal.rb +131 -0
  67. data/test/scripts/6.rb +205 -0
  68. data/test/scripts/6.tz.rb +105 -0
  69. data/test/scripts/7.phase.rb +109 -0
  70. data/test/scripts/7.rb +95 -0
  71. data/test/scripts/7.term.rb +128 -0
  72. data/test/scripts/7.week.rb +84 -0
  73. data/test/scripts/8.ext.rb +61 -0
  74. data/test/scripts/8.rb +62 -0
  75. data/test/scripts/9.ext.rb +131 -0
  76. data/test/scripts/9.rb +130 -0
  77. data/test/scripts/chinese-luni-solar.rb +52 -0
  78. data/test/{examples → scripts}/geometric_complex.rb +41 -41
  79. data/test/scripts/geometric_complex.txt +18 -0
  80. data/test/scripts/korea.rb +59 -0
  81. data/test/scripts/thai-reviewed.txt +211 -0
  82. data/test/scripts/thai.rb +36 -0
  83. data/test/scripts/thai.txt +210 -0
  84. data/test/test.rb +7 -0
  85. data/test/test/basictypes.rb +22 -0
  86. data/test/test/coordinates.rb +2 -1
  87. data/test/test/ephemeris.rb +34 -2
  88. data/test/test/icalendar.rb +12 -0
  89. data/test/test/inspect.rb +37 -1
  90. data/test/test/parts.rb +4 -3
  91. data/test/test/region/armenian.rb +20 -0
  92. data/test/test/region/bahai.rb +58 -0
  93. data/test/test/region/chinese.rb +14 -3
  94. data/test/test/region/christian.rb +16 -35
  95. data/test/test/region/discordian.rb +20 -0
  96. data/test/test/region/indian.rb +30 -2
  97. data/test/test/region/japanese.rb +24 -0
  98. data/test/test/region/jewish.rb +2 -0
  99. data/test/test/region/m17n.rb +9 -0
  100. data/test/test/region/reforms.rb +121 -0
  101. data/test/test/region/residue.rb +17 -11
  102. data/test/test/region/shire.rb +58 -0
  103. data/test/test/region/swedish.rb +45 -0
  104. data/test/test/region/zoroastrian.rb +58 -0
  105. data/test/test/tmobjects.rb +74 -0
  106. data/test/test/tmposition.rb +468 -397
  107. data/when_exe.gemspec +2 -2
  108. metadata +49 -6
@@ -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
- if @epoch.length == 1
1426
- epoch[0].frame.synchronize {
1427
- range = When::Parts::GeometricComplex.new([[epoch[0],true]])
1428
- ancestors.each do |ancestor|
1429
- epoch[0].frame.domain[ancestor] |= range
1430
- end
1431
- } if epoch[0].frame
1432
- elsif reverse?
1433
- epoch[1].frame.synchronize {
1434
- range = When::Parts::GeometricComplex.new([[epoch[1],true]], true)
1435
- ancestors.each do |ancestor|
1436
- epoch[1].frame.domain[ancestor] |= range
1437
- end
1438
- } if epoch[1].frame
1439
- else
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[i].frame.domain[ancestor] |= range
1461
+ epoch[1].frame.domain[ancestor] |= range
1445
1462
  end
1446
- } if epoch[i].frame
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
- return epoch, CalDate.new(cal_date, {:frame=>frame}) unless clock
1667
- return epoch, DateAndTime.new(cal_date, time+frac, {:frame=>frame, :clock=>clock})
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
  # 代表的な元期
@@ -6,5 +6,5 @@
6
6
  =end
7
7
 
8
8
  module When
9
- VERSION = "0.3.7"
9
+ VERSION = "0.3.8"
10
10
  end
@@ -1,4 +1,7 @@
1
1
  See online documents.
2
- wiki: http://www2u.biglobe.ne.jp/~suchowan/when_exe_wiki.html
3
- yard: http://rubydoc.info/gems/when_exe/frames
4
- demo: http://hosi.org
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)
@@ -11,7 +11,7 @@ require 'when_exe'
11
11
  include When
12
12
 
13
13
  #require 'date'
14
- #pp now({:clock=>'+0900'}).to_date_time.strftime('%+')
14
+ #pp now({:clock=>'+0900'}).to_datetime.strftime('%+')
15
15
 
16
16
  #=begin
17
17
  date = today
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