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
@@ -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
+