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.
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