when_exe - A multicultural and multilingualized calendar library

Gem Version

when_exe is a multicultural and multilingualized calendar library based on ISO 8601, ISO 19108, RFC 5545 and RFC6350.

Installation

The when_exe gem can be installed by running:

gem install when_exe

Documentation

API documentation for when_exe is available on RubyDoc.info.

License

This beta version's license is limited. Please see LICENSE.txt for details.

Source Code

Source code for when_exe is available on GitHub.

Example Usage

require 'when_exe'

# When::TM::CalDate

gregorian_date = When.tm_pos(2014, 8, 1)
p gregorian_date                             #=> 2014-08-01
p When.when?('2014-08-01')                   #=> 2014-08-01, the same date
p gregorian_date.to_i                        #=> 2456871, Julian Day Number(Integer)
p gregorian_date.to_f                        #=> 2456871.0, at noon for UTC
p gregorian_date.class                       #=> When::TM::CalDate
p gregorian_date.frame.iri                   #=> "http://hosi.org/When/CalendarTypes/Gregorian"
puts gregorian_date.name(When::MONTH) / 'en' #=> August
puts gregorian_date.name(When::MONTH) / 'fr' #=> août
puts gregorian_date.name(When::MONTH) / 'ar' #=> اغسطس
p gregorian_date.easter                      #=> 2014-04-20
p gregorian_date.is?('Easter')               #=> false
p When.tm_pos(2014, 4, 20).is?('Easter')     #=> true

islamic_date = When::TabularIslamic ^ gregorian_date
p islamic_date                               #=> 1435-10-04
p islamic_date.frame.iri                     #=> ""http://hosi.org/When/CalendarTypes/TabularIslamic"
puts islamic_date.name(When::MONTH) / 'en'   #=> Shawwal
puts islamic_date.name(When::MONTH) / 'ar'   #=> شوال

# When::TM::DateAndTime

gregorian_date = When.tm_pos(2014, 8, 1, 9, 0, 0, :clock=>'+09:00')
p gregorian_date                             #=> 2014-08-01T09:00:00+09:00
p When.when?('2014-08-01T09:00:00+09:00')    #=> 2014-08-01T09:00:00+09:00, the same date
p gregorian_date.to_i                        #=> 2456871, Julian Day Number(Integer)
p gregorian_date.to_f                        #=> 2456870.5 at 09:00:00 of Timezone +09:00
p gregorian_date.class                       #=> When::TM::DateAndTime
p gregorian_date.frame.iri                   #=> "http://hosi.org/When/CalendarTypes/Gregorian"
p gregorian_date.clk_time.class              #=> When::TM::ClockTime
p gregorian_date.clk_time.frame.iri          #=> "http://hosi.org/When/TM/Clock?label=+09:00"

gregorian_date = When.tm_pos(2014, 8, 1, 9, 0, 0, :clock=>'+09:00',
                                                  :long=>'139.413012E', :lat=>'35.412222N')
p gregorian_date                             #=> 2014-08-01T09:00:00+09:00
p gregorian_date.location.iri                #=> "http://hosi.org/When/Coordinates/Spatial?long=139.413012E&lat=35.412222N&alt=0"
p gregorian_date.sunrise.floor(When::MINUTE) #=> 2014-08-01T04:48+09:00
p gregorian_date.sunset.floor(When::MINUTE)  #=> 2014-08-01T18:46+09:00

darian_date = When::Darian ^ gregorian_date
p darian_date                                #=> 0216-13-23T15:12:11MTC
p darian_date.to_i                           #=> 49974, Serial Day Number(Integer)
p darian_date.to_f                           #=> 49974.13346485421
p darian_date.frame.iri                      #=> "http://hosi.org/When/CalendarTypes/Darian"
p darian_date.clk_time.frame.iri             #=> "http://hosi.org/When/CalendarTypes/MTC"
p darian_date.time_standard.iri              #=> "http://hosi.org/When/TimeStandard/MartianTimeCoordinated?location=(_l:long=0&datum=Mars)"

# When::TM::CalendarEra

babylonian_date = When.tm_pos('NebuchadnezzarII', 1, 1, 1)
p babylonian_date                            #=> NebuchadnezzarII01(-603).01.01
p When.when?('NebuchadnezzarII1.1.1')        #=> NebuchadnezzarII01(-603).01.01, the same date
p babylonian_date.to_i                       #=> 1500904, Julian Day Number(Integer)
p When.era('NebuchadnezzarII')               #=> [_e:AncientOrient::Neo-Babylonian::NebuchadnezzarII]
p When.era('NebuchadnezzarII')[0] ^ 1500904  #=> NebuchadnezzarII01(-603).01.01, the same date
p babylonian_date.to_f                       #=> 1500904.0, at noon for UTC
p babylonian_date.frame.iri                  #=> "http://hosi.org/When/CalendarTypes/BabylonianPD"
p babylonian_date.calendar_era.iri           #=> "http://hosi.org/When/TM/CalendarEra/AncientOrient::Neo-Babylonian::NebuchadnezzarII"

babylonian_date   = When.when?('NebuchadnezzarII1.1.1T18:13:00',
                               :clock=>'+03:00?long=45&lat=32&border=Sunset')
4.times do
  p [babylonian_date  , babylonian_date  .to_i] #=>
    # [NebuchadnezzarII01(-603).01.01T:18:13:00+03:00, 1500904]
    # [NebuchadnezzarII01(-603).01.01T:18:14:00+03:00, 1500904]
    # [NebuchadnezzarII01(-603).01.02T*18:15:00+03:00, 1500905]
    # [NebuchadnezzarII01(-603).01.02T*18:16:00+03:00, 1500905]
  babylonian_date   += When::PT1M
end

# TZInfo
#  https://rubygems.org/gems/tzinfo is required for this section's operations.
#  Please install tzinfo before operation.

gregorian_date = When.tm_pos(2014, 8, 1, 9, 0, 0, :tz=>'Asia/Tokyo')
p gregorian_date                             #=> 2014-08-01T09:00:00+09:00
p gregorian_date.location.iri                #=> "http://hosi.org/When/Coordinates/Spatial?long=139.4441E&lat=35.3916N&label=Asia/Tokyo"
p gregorian_date.sunrise.floor(When::MINUTE) #=> 2014-08-01T04:48+09:00
p gregorian_date.sunset.floor(When::MINUTE)  #=> 2014-08-01T18:45+09:00

jst = When.tm_pos(1997, 4, 6, 15, 30, 00, :tz=>'Asia/Tokyo')
p jst                                        #=> 1997-04-06T15:30:00+09:00
est = When.Clock('America/New_York') ^ jst
p est                                        #=> 1997-04-06T01:30:00-05:00
jst = When.tm_pos(1997, 4, 6, 16, 30, 00, :tz=>'Asia/Tokyo')
p jst                                        #=> 1997-04-06T16:30:00+09:00
edt = When.Clock('America/New_York') ^ jst
p edt                                        #=> 1997-04-06T03:30:00-04:00

p When.when?('TZID=America/New_York:1997-10-26T01:30') #=> 1997-10-26T01:30-04:00
p When.when?('TZID=America/New_York:1997-10-26T01=30') #=> 1997-10-26T01:30-05:00
p When.when?('TZID=America/New_York:1997-10-26T02:30') #=> 1997-10-26T02:30-05:00
p When.when?('TZID=America/New_York:1997-10-26T03:30') #=> 1997-10-26T03:30-05:00

# Google Calendar
#  https://github.com/suchowan/gcalapi is required for this section's operations.
#  Please install gcalapi before operation.
#  Please replace xxxxxxxx and ******** to valid pair of id and password.

service = GoogleCalendar::Service.new('[email protected]', '********')
feed = "http://www.google.com/calendar/feeds/%s__%s%%40holiday.calendar.google.com/public/full" %
        ['japanese', 'ja']
gcal = GoogleCalendar::Calendar::new(service, feed)
gcal.enum_for({'start-min'=>'2014-01-01', 'start-max'=>'2015-01-01',
               'orderby'=>'starttime', 'sortorder'=>'a'
              }).each do |range|
  puts '%s - %s' % [range, range.events[0].summary] #=>
    # 2014-01-01T00:00:00.00+09:00...2014-01-02T00:00:00.00+09:00 - 元日
    # 2014-01-02T00:00:00.00+09:00...2014-01-03T00:00:00.00+09:00 - 銀行休業日
    # 2014-01-03T00:00:00.00+09:00...2014-01-04T00:00:00.00+09:00 - 銀行休業日
    # 2014-01-13T00:00:00.00+09:00...2014-01-14T00:00:00.00+09:00 - 成人の日
    # 2014-02-11T00:00:00.00+09:00...2014-02-12T00:00:00.00+09:00 - 建国記念の日
    # 2014-03-21T00:00:00.00+09:00...2014-03-22T00:00:00.00+09:00 - 春分の日
    # 2014-04-29T00:00:00.00+09:00...2014-04-30T00:00:00.00+09:00 - 昭和の日
    # 2014-05-03T00:00:00.00+09:00...2014-05-04T00:00:00.00+09:00 - 憲法記念日
    # 2014-05-04T00:00:00.00+09:00...2014-05-05T00:00:00.00+09:00 - みどりの日
    # 2014-05-05T00:00:00.00+09:00...2014-05-06T00:00:00.00+09:00 - こどもの日
    # 2014-05-06T00:00:00.00+09:00...2014-05-07T00:00:00.00+09:00 - みどりの日 振替休日
    # 2014-07-21T00:00:00.00+09:00...2014-07-22T00:00:00.00+09:00 - 海の日
    # 2014-09-15T00:00:00.00+09:00...2014-09-16T00:00:00.00+09:00 - 敬老の日
    # 2014-09-23T00:00:00.00+09:00...2014-09-24T00:00:00.00+09:00 - 秋分の日
    # 2014-10-13T00:00:00.00+09:00...2014-10-14T00:00:00.00+09:00 - 体育の日
    # 2014-11-03T00:00:00.00+09:00...2014-11-04T00:00:00.00+09:00 - 文化の日
    # 2014-11-23T00:00:00.00+09:00...2014-11-24T00:00:00.00+09:00 - 勤労感謝の日
    # 2014-11-24T00:00:00.00+09:00...2014-11-25T00:00:00.00+09:00 - 勤労感謝の日 振替休日
    # 2014-12-23T00:00:00.00+09:00...2014-12-24T00:00:00.00+09:00 - 天皇誕生日
    # 2014-12-25T00:00:00.00+09:00...2014-12-26T00:00:00.00+09:00 - クリスマス
    # 2014-12-31T00:00:00.00+09:00...2015-01-01T00:00:00.00+09:00 - 大晦日
end

For further detail, please refer to the when_exe Wiki pages.