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
@@ -0,0 +1,105 @@
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の使用例/6.iCalendar/時間帯
9
+
10
+ # イベントが夏時間と標準時間の切り替えをまたがる場合の振舞
11
+
12
+ # →関連クラス図 [[Calendar/When/Ruby/3.クラス図/12.時間参照系]]
13
+
14
+ # *準備
15
+ # when_exe Ruby 版の When モジュールを include する
16
+ require 'when_exe'
17
+ include When
18
+
19
+ # *時間帯の指定に When::V::Timezone を使用する場合
20
+ # **.icsファイルで時間帯を定義
21
+ -- NewYork.ics -- (使用する場合は行頭の空白を削除)
22
+ BEGIN:VCALENDAR
23
+ VERSION:2.0
24
+ PRODID:-//hacksw/handcal//NONSGML v1.0//EN
25
+ BEGIN:VTIMEZONE
26
+ TZID:America/New_York
27
+ LAST-MODIFIED:20050809T050000Z
28
+ BEGIN:STANDARD
29
+ DTSTART:19671029T020000
30
+ RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=20061029T060000Z
31
+ TZOFFSETFROM:-0400
32
+ TZOFFSETTO:-0500
33
+ TZNAME:EST
34
+ END:STANDARD
35
+ BEGIN:DAYLIGHT
36
+ DTSTART:19870405T020000
37
+ RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU;UNTIL=20060402T070000Z
38
+ TZOFFSETFROM:-0500
39
+ TZOFFSETTO:-0400
40
+ TZNAME:EDT
41
+ END:DAYLIGHT
42
+ END:VTIMEZONE
43
+ END:VCALENDAR
44
+ ----------------
45
+
46
+ vcal = Resource("NewYork.ics") # "NewYork.ics"をメモリに読み込む
47
+ p [vcal.class, vcal.iri] #=> [When::V::Calendar, "NewYork.ics"]
48
+ tz = vcal["America/New_York"]
49
+ p [tz.class, tz.iri] #=> [When::V::Timezone, "NewYork.ics::America/New_York"]
50
+
51
+ # ** 標準時間→夏時間
52
+ When::V::Event.new({
53
+ 'rrule' => 'FREQ=YEARLY;BYMONTH=4;BYDAY=1SU;BYHOUR=1,2,3,4;BYMINUTE=30;COUNT=4',
54
+ 'dtstart' => 'TZID=America/New_York:19970406T013000'
55
+ }).each do |date|
56
+ p date #=> 1997-04-06T01:30:00-05:00, 1997-04-06T03:30:00-04:00, 1997-04-06T04:30:00-04:00, 1998-04-05T01:30:00-05:00
57
+ end
58
+
59
+ # ** 夏時間→標準時間(重複する1時間内はスキップ)
60
+ When::V::Event.new({
61
+ 'rrule' => 'FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;BYHOUR=1,2,3;BYMINUTE=30;COUNT=4',
62
+ 'dtstart' => 'TZID=America/New_York:19971026T013000'
63
+ }).each do |date|
64
+ p date #=> 1997-10-26T01:30:00-04:00, 1997-10-26T02:30:00-05:00, 1997-10-26T03:30:00-05:00, 1998-10-25T01:30:00-04:00
65
+ end
66
+
67
+ # ** 夏時間→標準時間(重複する1時間内のイベントも発生)
68
+ When::V::Event.new({
69
+ 'rrule' => 'FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;BYHOUR=1,1=,2,3;BYMINUTE=30;COUNT=5',
70
+ 'dtstart' => 'TZID=America/New_York:19971026T013000'
71
+ }).each do |date|
72
+ p date #=> 1997-10-26T01:30:00-04:00, 1997-10-26T01:30:00-05:00, 1997-10-26T02:30:00-05:00, 1997-10-26T03:30:00-05:00, 1998-10-25T01:30:00-04:00
73
+ end
74
+
75
+ # BYHOUR=1,1=,2,3 の 1= は [[When.exe Standard Expression>http://www.asahi-net.or.jp/~dd6t-sg/when_rdoc/when.html#label-8]] の書式に準じている
76
+
77
+ # *時間帯の指定に TZInfo::Timezone を使用する場合
78
+ # メモリに America/Chicago に対応する When::V::Timezone が読み込まれていない場合、TZInfo::Timezoneを使用する
79
+ # ** 標準時間→夏時間
80
+ When::V::Event.new({
81
+ 'rrule' => 'FREQ=YEARLY;BYMONTH=4;BYDAY=1SU;BYHOUR=1,2,3,4;BYMINUTE=30;COUNT=4',
82
+ 'dtstart' => 'TZID=America/Chicago:19970406T013000'
83
+ }).each do |date|
84
+ p date #=> 1997-04-06T01:30:00-06:00, 1997-04-06T03:30:00-05:00, 1997-04-06T04:30:00-05:00, 1998-04-05T01:30:00-06:00
85
+ end
86
+
87
+ # ** 夏時間→標準時間(重複する1時間内はスキップ)
88
+ When::V::Event.new({
89
+ 'rrule' => 'FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;BYHOUR=1,2,3;BYMINUTE=30;COUNT=4',
90
+ 'dtstart' => 'TZID=America/Chicago:19971026T013000'
91
+ }).each do |date|
92
+ p date #=> 1997-10-26T01:30:00-05:00, 1997-10-26T02:30:00-06:00, 1997-10-26T03:30:00-06:00, 1998-10-25T01:30:00-05:00
93
+ end
94
+
95
+ # ** 夏時間→標準時間(重複する1時間内のイベントも発生)
96
+ When::V::Event.new({
97
+ 'rrule' => 'FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;BYHOUR=1,1=,2,3;BYMINUTE=30;COUNT=5',
98
+ 'dtstart' => 'TZID=America/Chicago:19971026T013000'
99
+ }).each do |date|
100
+ p date #=> 1997-10-26T01:30:00-05:00, 1997-10-26T01:30:00-06:00, 1997-10-26T02:30:00-06:00, 1997-10-26T03:30:00-06:00, 1998-10-25T01:30:00-05:00
101
+ end
102
+
103
+ # 制限 : BYHOUR=1= から生成した 1997-10-26T01:30:00-06:00 が保持する時間帯は -06:00 固定となり加減算しても変わらない。
104
+
105
+
@@ -0,0 +1,109 @@
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の使用例/7.暦注/月の位相
9
+
10
+ # *準備
11
+ # when_exe Ruby 版の When モジュールを include する
12
+ require 'date'
13
+ require 'when_exe'
14
+ include When
15
+
16
+ # *天体暦
17
+
18
+ # 標準時を日本時間にしておく
19
+ TM::Clock.local_time = '+09:00'
20
+
21
+ # ** 望の日付
22
+ # *** 天体暦用暦注リソースを明示的に使用
23
+ date = when?('2014-01-01') #=> 2014-01-01
24
+ p date.class #=> When::TM::CalDate
25
+ note = CalendarNote('LunarPhases')
26
+ p note.class #=> When::CalendarNote::LunarPhases
27
+ p note.phase(date, 15) #=> 2014-01-16 (2014-01-01の直後の望)
28
+ p note.phase(date, -15) #=> 2013-12-17 (2014-01-01の直前の望)
29
+
30
+ # *** 天体暦用暦注リソースを暗黙的に使用
31
+ date = when?('2014-01-01') #=> 2014-01-01
32
+ p date.class #=> When::TM::CalDate
33
+ p date.frame.class #=> When::CalendarTypes::Gregorian
34
+ p date.frame.note.class #=> When::CalendarNote::Christian
35
+ p date.phase(15) #=> 2014-01-16 (2014-01-01の直後の望)
36
+ p date.phase(-15) #=> 2013-12-17 (2014-01-01の直前の望)
37
+
38
+ # &yard(When::CalendarNote::Christian,2)には phase メソッドがないため、代替して&yard(When::CalendarNote::LunarPhases,2)が使用される
39
+
40
+ # ** 朔の時刻
41
+ # *** 天体暦用暦注リソースを明示的に使用
42
+ time = when?('2014-01-01T00:00') #=> 2014-01-01T00:00+09:00
43
+ p time.class #=> When::TM::DateAndTime
44
+ note = CalendarNote('LunarPhases')
45
+ p note.class #=> When::CalendarNote::LunarPhases
46
+ p note.phase(time) #=> 2014-01-01T20:14+09:00 (2014-01-01の直後の朔, time と同じ分解能)
47
+ p note.phase(time, -30) #=> 2013-12-03T09:22+09:00 (2014-01-01の直前の朔, time と同じ分解能)
48
+
49
+ # *** 天体暦用暦注リソースを暗黙的に使用
50
+ time = when?('2014-01-01T00:00') #=> 2014-01-01T00:00+09:00
51
+ p time.class #=> When::TM::DateAndTime
52
+ p time.frame.class #=> When::CalendarTypes::Gregorian
53
+ p time.frame.note.class #=> When::CalendarNote::Christian
54
+ p time.phase #=> 2014-01-01T20:14+09:00 (2014-01-01の直後の朔, time と同じ分解能)
55
+ p time.phase(-30) #=> 2013-12-03T09:22+09:00 (2014-01-01の直前の朔, time と同じ分解能)
56
+
57
+ # phase メソッドの引数 0(=月の位相 0 ティティ)は省略できる
58
+
59
+ # ** 朔の日付時刻(標準の日付時刻クラスを使用)
60
+ # *** 天体暦用暦注リソースを明示的に使用
61
+ date = Date.new(2014,1,1) #=> #<Date: 2014-01-01 (4913317/2,0,2299161)>
62
+ time = DateTime.new(2014,1,1) #=> #<DateTime: 2014-01-01T00:00:00+00:00 (4913317/2,0,2299161)>
63
+ note = CalendarNote('LunarPhases')
64
+ p note.class #=> When::CalendarNote::LunarPhases
65
+ p note.phase(date) #=> 2014-01-31
66
+ p note.phase(time) #=> 2014-01-01T11:14:09.85Z
67
+
68
+ # UTC の正午は朔の後のため、直後の朔は1月31日になる
69
+
70
+ # *** 天体暦用暦注リソースを暗黙的に使用
71
+ require 'when_exe/core/extension'
72
+ date = Date.new(2014,1,1) #=> #<Date: 2014-01-01 (4913317/2,0,2299161)>
73
+ time = DateTime.new(2014,1,1) #=> #<DateTime: 2014-01-01T00:00:00+00:00 (4913317/2,0,2299161)>
74
+ p date.phase #=> #<Date: 2014-01-31 (4913377/2,0,2299161)>
75
+ p time.phase #=> #<DateTime: 2014-01-01T11:14:09+00:00 (70751778283/28800,0/1,2299161)>
76
+
77
+ # *宣明暦
78
+
79
+ # 標準時を未定義にしておく
80
+ TM::Clock.local_time = nil
81
+
82
+ # ** 望の日付
83
+ date = when?('康和3.2.1') #=> 康和03(1101).02.01
84
+ p date.class #=> When::TM::CalDate
85
+ p date.frame.note.class #=> When::CalendarNote::JapaneseNote
86
+ p date.phase(15) #=> 康和03(1101).02.16
87
+ p date.phase(-15) #=> 康和03(1101).01.16=
88
+
89
+ # &yard(When::CalendarNote::JapaneseNote,2)の phase メソッドが使われ、当時行用されていた宣明暦で計算が行われる
90
+
91
+ # 宣明暦での康和3年正月望は康和03(1101).01.16の翌朝の日の出前であるため = が付く
92
+
93
+ # (= は<When.exe Standard Representation ([[Calendar/When/Ruby/2.APIの使用例/1.前提となる概念/1.日付時刻の表現]])> で翌日を意味する)
94
+
95
+ # ** 月の位相の日付一覧
96
+ [0, 7.5, 15, 22.5, 30].each do |phase|
97
+ date = when?('康和3.2.1T00:00').phase(phase)
98
+ p date #=> 下記
99
+ # 康和03(1101).02.01T04:33Z
100
+ # 康和03(1101).02.08=T03:27Z
101
+ # 康和03(1101).02.16T14:41Z
102
+ # 康和03(1101).02.23T09:36Z
103
+ # 康和03(1101).03.01*T19:36Z
104
+ end
105
+
106
+
107
+ # 宣明暦での康和3年3月朔は進朔しており実際は前日であるため * が付く
108
+
109
+ # (* は<When.exe Standard Representation ([[Calendar/When/Ruby/2.APIの使用例/1.前提となる概念/1.日付時刻の表現]])> で前日を意味する)
data/test/scripts/7.rb ADDED
@@ -0,0 +1,95 @@
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の使用例/7.暦注
9
+
10
+ # →関連クラス図 [[Calendar/When/Ruby/3.クラス図/03.CalendarTypes]]
11
+
12
+ # *準備
13
+ # when_exe Ruby 版の When モジュールを include する
14
+ require 'when_exe'
15
+ include When
16
+
17
+ # 七曜表の扱いなどについては[[Calendar/When/Ruby/2.APIの使用例/7.暦注/七曜]]を参照
18
+
19
+ # *復活祭
20
+ # ** グレゴリオ暦
21
+ gdate = CalendarNote('Christian').easter(when?('2013'))
22
+ p [gdate, gdate.frame.class] #=> [2013-03-31, When::CalendarTypes::Gregorian]
23
+ gdate = when?('2013').easter
24
+ p [gdate, gdate.frame.class] #=> [2013-03-31, When::CalendarTypes::Gregorian]
25
+ p gdate.events #=> ["easter"]
26
+ p gdate.to_h(:method=>:to_m17n) #=> 下記
27
+ # {:frame=>"http://hosi.org/When/CalendarTypes/Gregorian",
28
+ # :precision=>0,
29
+ # :events=>["easter"],
30
+ # :sdn=>2456383,
31
+ # :calendar=>["http://hosi.org/When/CalendarTypes/Gregorian"],
32
+ # :notes=>[[{:note=>"Month", :value=>"March"}], []],
33
+ # :cal_date=>[2013, 3, 31]}
34
+ p CalendarNote('Christian').include?(gdate, 'easter') #=> true
35
+ p gdate.is?('easter') #=> true
36
+ p CalendarNote('Christian').include?(Calendar('Julian') ^ gdate, 'easter') #=> false
37
+ p (Calendar('Julian') ^ gdate).is?('easter') #=> false
38
+
39
+ # ** ユリウス暦
40
+ jdate = CalendarNote('Christian').easter(when?('2013^^Julian'))
41
+ p [jdate, jdate.frame.class, Calendar('Gregorian') ^ jdate] #=> [2013-04-22, When::CalendarTypes::Julian, 2013-05-05]
42
+ jdate = when?('2013^^Julian').easter
43
+ p [jdate, jdate.frame.class, Calendar('Gregorian') ^ jdate] #=> [2013-04-22, When::CalendarTypes::Julian, 2013-05-05]
44
+ p jdate.events #=> ["easter"]
45
+ p CalendarNote('Christian').include?(jdate, 'easter') #=> true
46
+ p jdate.is?('easter') #=> true
47
+ p CalendarNote('Christian').include?(Calendar('Gregorian') ^ jdate, 'easter') #=> false
48
+ p (Calendar('Gregorian') ^ jdate).is?('easter') #=> false
49
+
50
+ # *秋分の日
51
+ # **デフォルト暦注
52
+ date = when?('H25.9.23')
53
+ p date #=> H25(2013).09.23
54
+ p date.frame.iri #=> "http://hosi.org/When/CalendarTypes/Gregorian?note=DefaultNotes"
55
+ p date.notes #=>[[{:note=>"Month", :value=>"September"}], []]
56
+
57
+ # &yard(When::TM::CalendarEra,1)('&yard(ModernJapanese)')は日本暦注を読み込まない
58
+
59
+ # **日本暦注
60
+ date = when?('平成25.9.23') # ここで日本暦日をメモリに展開するため、少々時間がかかる
61
+ p date #=> 平成25(2013).09.23
62
+ p date.frame.iri #=> "http://hosi.org/When/CalendarTypes/Gregorian?note=JapaneseNote"
63
+ p date.notes #=> 下記
64
+ # [[{:note=>"干支", :value=>"癸巳(29)", :position=>"共通"}],
65
+ # [{:note=>"月名", :value=>"September", :position=>"月建"}],
66
+ # [{:note=>"干支", :value=>"壬辰(28)", :position=>"共通"},
67
+ # {:note=>"六曜", :value=>"友引", :position=>"民間"},
68
+ # {:note=>"廿四節気", :value=>"秋分(180)", :position=>"時候"},
69
+ # {:note=>"祝祭日", :value=>"秋分の日", :position=>"祝祭日"}]]
70
+ p date.notes("祝祭日") #=> {:note=>"祝祭日", :value=>"秋分の日", :position=>"祝祭日"}
71
+ p date.is?({:note=>"祝祭日", :value=>"秋分の日"}) #=> true
72
+ p date.is?("祝祭日") #=> true
73
+ p date.is?("秋分の日") #=> true
74
+
75
+ # *応永年間
76
+ # **すべての日本暦注
77
+ date = when?('応永25.9.23')
78
+ p date #=> 応永25(1418).09.23
79
+ p date.notes({:notes=>:all, :locale=>'ja.UTF-8'}) #=> 省略 (全暦注出力)
80
+
81
+ # *ヒンドゥー暦
82
+ # **パンチャンガ
83
+ date = Calendar('HinduLuniSolar?note=HinduNote') ^ when?('2013-5-28', :clock=>'+05:30')
84
+ p date #=> 1935-02<04-T+05:30
85
+ p date.notes({:locale=>'ja.UTF-8'}) #=> 下記
86
+ # [[],
87
+ # [{:note=>"Month",
88
+ # :value=>"Vaiśākha Kṛṣṇapakṣa"}],
89
+ # [{:note=>"tithi", :value=>["Chaturthi(00:42:49)"]},
90
+ # {:note=>"vara", :value=>["Maṅgala(05:48:00)"]},
91
+ # {:note=>"naksatra", :value=>["U. āṣāḍha(16:47:13)"]},
92
+ # {:note=>"yoga", :value=>["ukla(11:57:35)"]},
93
+ # {:note=>"karana", :value=>["Bālava(13:54:42)", "Kaulava(00:42:49)"]}]]
94
+
95
+ # それぞれの要素の値が上記になる時刻を時間帯+05:30で表記
@@ -0,0 +1,128 @@
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の使用例/7.暦注/二十四節気
9
+
10
+ # *準備
11
+ # when_exe Ruby 版の When モジュールを include する
12
+ require 'when_exe'
13
+ include When
14
+
15
+ # *天体暦
16
+
17
+ # 標準時を日本時間にしておく
18
+ TM::Clock.local_time = '+09:00'
19
+
20
+ # ** 冬至の日付
21
+ # *** 天体暦用暦注リソースを明示的に使用
22
+ date = when?('2014-01-01') #=> 2014-01-01
23
+ p date.class #=> When::TM::CalDate
24
+ note = CalendarNote('SolarTerms')
25
+ p note.class #=> When::CalendarNote::SolarTerms
26
+ p note.term(date, 270) #=> 2014-12-22 (2014-01-01の直後の冬至)
27
+ p note.term(date, -90) #=> 2013-12-22 (2014-01-01の直前の冬至)
28
+
29
+ # *** 天体暦用暦注リソースを暗黙的に使用
30
+ date = when?('2014-01-01') #=> 2014-01-01
31
+ p date.class #=> When::TM::CalDate
32
+ p date.frame.class #=> When::CalendarTypes::Gregorian
33
+ p date.frame.note.class #=> When::CalendarNote::Christian
34
+ p date.term(270) #=> 2014-12-22 (2014-01-01の直後の冬至)
35
+ p date.term(-90) #=> 2013-12-22 (2014-01-01の直前の冬至)
36
+
37
+ # &yard(When::CalendarNote::Christian,2)には term メソッドがないため、代替して&yard(When::CalendarNote::SolarTerms,2)が使用される
38
+
39
+ # ** 春分の時刻
40
+ # *** 天体暦用暦注リソースを明示的に使用
41
+ time = when?('2014-01-01T00:00') #=> 2014-01-01T00:00+09:00
42
+ p time.class #=> When::TM::DateAndTime
43
+ note = CalendarNote('SolarTerms')
44
+ p note.class #=> When::CalendarNote::SolarTerms
45
+ p note.term(time) #=> 2014-03-21T01:56+09:00 (2014-01-01の直後の春分, time と同じ分解能)
46
+ p note.term(time, -360) #=> 2013-03-20T20:02+09:00 (2014-01-01の直前の春分, time と同じ分解能)
47
+
48
+ # *** 天体暦用暦注リソースを暗黙的に使用
49
+ time = when?('2014-01-01T00:00') #=> 2014-01-01T00:00+09:00
50
+ p time.class #=> When::TM::DateAndTime
51
+ p time.frame.class #=> When::CalendarTypes::Gregorian
52
+ p time.frame.note.class #=> When::CalendarNote::Christian
53
+ p time.term #=> 2014-03-21T01:56+09:00 (2014-01-01の直後の春分, time と同じ分解能)
54
+ p time.term(-360) #=> 2013-03-20T20:02+09:00 (2014-01-01の直前の春分, time と同じ分解能)
55
+
56
+ # term メソッドの引数 0(=太陽黄経 0 度)は省略できる
57
+
58
+ # ** 春分の日付時刻(標準の日付時刻クラスを使用)
59
+ # *** 天体暦用暦注リソースを明示的に使用
60
+ require 'date'
61
+ date = Date.new(2014,1,1) #=> #<Date: 2014-01-01 (4913317/2,0,2299161)>
62
+ time = DateTime.new(2014,1,1) #=> #<DateTime: 2014-01-01T00:00:00+00:00 (4913317/2,0,2299161)>
63
+ note = CalendarNote('SolarTerms')
64
+ p note.class #=> When::CalendarNote::SolarTerms
65
+ p note.term(date) #=> 2014-03-21
66
+ p note.term(time) #=> 2014-03-20T16:56:55.09Z
67
+
68
+ # *** 天体暦用暦注リソースを暗黙的に使用
69
+ require 'when_exe/core/extension'
70
+ date = Date.new(2014,1,1) #=> #<Date: 2014-01-01 (4913317/2,0,2299161)>
71
+ time = DateTime.new(2014,1,1) #=> #<DateTime: 2014-01-01T00:00:00+00:00 (4913317/2,0,2299161)>
72
+ p date.term #=> #<Date: 2014-03-21 (4913475/2,0,2299161)>
73
+ p time.term #=> #<DateTime: 2014-03-20T16:56:55+00:00 (42452418923/17280,0/1,2299161)>
74
+
75
+ # *宣明暦
76
+
77
+ # 冬至の日付を移動して朔旦冬至にした建仁2~3年を例にする
78
+
79
+ # 標準時を未定義にしておく
80
+ TM::Clock.local_time = nil
81
+
82
+ # ** 冬至の日付
83
+ date = when?('建仁03.01.01') #=> 建仁03(1203).01.01
84
+ p date.class #=> When::TM::CalDate
85
+ p date.frame.note.class #=> When::CalendarNote::JapaneseNote
86
+ p date.term(270) #=> 建仁03(1203).11.12
87
+ p date.term(-90) #=> 建仁02(1202).11.01*
88
+
89
+ # &yard(When::CalendarNote::JapaneseNote,2)の term メソッドが使われ、当時行用されていた宣明暦で計算が行われる
90
+
91
+ # 宣明暦での建仁2年の冬至は建仁02(1202).11.01の前日であるため * が付く
92
+
93
+ # (* は<When.exe Standard Representation ([[Calendar/When/Ruby/2.APIの使用例/1.前提となる概念/1.日付時刻の表現]])> で前日を意味する)
94
+
95
+ # ** 二十四節気の日付一覧
96
+ date = when?('建仁02.01.01') #=> 建仁02(1202).01.01
97
+ 25.times do |t|
98
+ # [0,15] は「太陽黄経を15で割って0余る」という指定
99
+ date = date.ceil.term([0,15])
100
+ p date #=> 下記
101
+ # 建仁02(1202).01.05
102
+ # 建仁02(1202).01.20
103
+ # 建仁02(1202).02.06
104
+ # 建仁02(1202).02.22
105
+ # 建仁02(1202).03.07
106
+ # 建仁02(1202).03.22
107
+ # 建仁02(1202).04.08
108
+ # 建仁02(1202).04.23
109
+ # 建仁02(1202).05.10
110
+ # 建仁02(1202).05.25
111
+ # 建仁02(1202).06.10
112
+ # 建仁02(1202).06.25
113
+ # 建仁02(1202).07.12
114
+ # 建仁02(1202).07.27
115
+ # 建仁02(1202).08.13
116
+ # 建仁02(1202).08.28
117
+ # 建仁02(1202).09.13
118
+ # 建仁02(1202).09.29
119
+ # 建仁02(1202).10.14
120
+ # 建仁02(1202).10.29
121
+ # 建仁02(1202).10=14
122
+ # 建仁02(1202).11.01*
123
+ # 建仁02(1202).11.16
124
+ # 建仁02(1202).12.01
125
+ # 建仁02(1202).12.16
126
+ end
127
+
128
+ # &yard(When::TM::CalDate,2)オブジェクトはその日付の正午に丸められるため ceil メソッドで日付をすすめる必要がある
@@ -0,0 +1,84 @@
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の使用例/7.暦注/七曜
9
+
10
+ # *準備
11
+ # when_exe Ruby 版の When モジュールを include する
12
+ require 'pp'
13
+ require 'when_exe'
14
+ require 'when_exe/mini_application'
15
+ include When
16
+
17
+ # *グレゴリオ暦
18
+ # ** 週
19
+ date = when?('2013-12-30')
20
+ p date.week_included #=> 2013-12-30...2014-01-06 (月曜始まり)
21
+ p date.week_included('Mon') #=> 2013-12-30...2014-01-06 (月曜始まり)
22
+ p date.week_included('Sun') #=> 2013-12-29...2014-01-05 (日曜始まり)
23
+
24
+ # ** 月
25
+ date = when?('2013-12-30')
26
+ p date.month_included #=> 2013-12-01...2014-01-01
27
+ p date.month_included.map {|date| date[DAY]} #=> [1,2, (snip), 31]
28
+ pp date.month_included('Sun') { |date, type|
29
+ case type #=> [["December 2013",
30
+ when YEAR ; date.strftime("%Y") # ["*", 1, 2, 3, 4, 5, 6, 7],
31
+ when MONTH ; date.strftime("%B %Y") # ["*", 8, 9, 10, 11, 12, 13, 14],
32
+ when WEEK ; '*' # ["*", 15, 16, 17, 18, 19, 20, 21],
33
+ when DAY ; date[DAY] # ["*", 22, 23, 24, 25, 26, 27, 28],
34
+ else ; '-' # ["*", 29, 30, 31,"-","-","-","-"]]]
35
+ end #
36
+ }
37
+
38
+ # ** 年
39
+ date = when?('2013-12-30')
40
+ p date.year_included #=> 2013-01-01...2014-01-01
41
+ pp date.year_included('Sun') { |date, type| #=> (省略)
42
+ When.column(date, type)
43
+ }
44
+
45
+ # *世界暦
46
+ # ** 週
47
+ date = when?('2013-12-30^^World')
48
+ p date.week_included #=> 2013-12-30...2014-01-06 (月曜始まり)
49
+ p date.week_included('Mon') #=> 2013-12-30...2014-01-06 (月曜始まり)
50
+ p date.week_included('Sun') #=> 2013-12-29...2014-01-05 (日曜始まり)
51
+ p date.week_included('WorldWeek') #=> 2013-12-24...2014-01-01 (日曜始まりの8日間)
52
+
53
+ # &yard(When::CalendarTypes::CalendarNote,1)('&yard(WorldWeek)')を使うと、専用の固定曜日を使用
54
+
55
+ # ** 月
56
+ date = when?('2013-12-30^^World')
57
+ pp date.month_included('Sun') {|date, type|
58
+ case type #=> [["December 2013",
59
+ when YEAR ; date.strftime("%Y") # ["*", 1, 2, 3, 4, 5, 6, 7],
60
+ when MONTH ; date.strftime("%B %Y") # ["*", 8, 9, 10, 11, 12, 13, 14],
61
+ when WEEK ; '*' # ["*", 15, 16, 17, 18, 19, 20, 21],
62
+ when DAY ; date[DAY] # ["*", 22, 23, 24, 25, 26, 27, 28],
63
+ else ; '-' # ["*", 29, 30, 31,"-","-","-","-"]]]
64
+ end #
65
+ }
66
+ pp date.month_included('WorldWeek') {|date, type|
67
+ case type #=> [["December 2013",
68
+ when YEAR ; date.strftime("%Y") # ["*","-","-","-","-","-", 1, 2],
69
+ when MONTH ; date.strftime("%B %Y") # ["*", 3, 4, 5, 6, 7, 8, 9],
70
+ when WEEK ; '*' # ["*", 10, 11, 12, 13, 14, 15, 16],
71
+ when DAY ; date[DAY] # ["*", 17, 18, 19, 20, 21, 22, 23],
72
+ else ; '-' # ["*", 24, 25, 26, 27, 28, 29, 30, 31]]]
73
+ end # 31日は七曜外
74
+ }
75
+
76
+ # &yard(CalendarNote)('&yard(WorldWeek)')を使うと、専用の固定曜日を使用
77
+
78
+ # ** 年
79
+ date = when?('2013-12-30^^World')
80
+ p date.year_included #=> 2013-01-01...2014-01-01
81
+ pp date.year_included('Sun') {|date, type| #=> (省略)
82
+ When.column(date, type)
83
+ }
84
+