新規作成 | 一覧 | RSS | FrontPage | 検索 | 更新履歴
[Calendar/When/Ruby/2.APIの使用例/2.逆引き/コア拡張] (前:2.逆引き|次:3.年号の扱い) (English)

コア拡張

コアクラスを require 'when_exe/core/extension' で拡張した場合の記法を確認

準備

when_exe Ruby 版の When モジュールを include する
 require 'when_exe'
 require 'when_exe/core/extension'
 include When

日付

現在の日付を取得する

 date = today
 p date       #=> 2013-05-24

日付オブジェクトを作成する

 date = [2013, 5,24].tm_pos
 p date       #=> 2013-05-24

日付オブジェクトを文字列に変換する

 p date.to_s  #=>"2013-05-24"

指定の日付が存在するかどうか調べる

 p [2013, 2,29].tm_pos                   #=> 2013-03-01
 p [2013, 2,29].tm_pos(:invalid=>:check) #=> nil
 begin
   p [2013, 2,29].tm_pos(:invalid=>:raise)
 rescue => e
   p e                                   #=> ArgumentError: Specified date not found: [2013, 2, 29]
 end

ユリウス日から日付オブジェクトを作成する

 date = 2451941.tm_pos          #=> 2001-01-31
 p date                         #=> 2001-01-31
 p date.to_i                    #=> 2451941

何日後、何日前の日付を求める

 date = [2013, 1, 31].tm_pos
 p date + P1D                   #=> 2013-02-01
 p date + 1.day_period_duration #=> 2013-02-01
 p date + 1                     #=> 2013-02-01
 p date.precision               #=> 0
 p date.succ                    #=> 2013-02-01

 date = [2013, 2,  1].tm_pos
 p date - P1D                   #=> 2013-01-31
 p date - 1.day_period_duration #=> 2013-01-31
 p date - 1                     #=> 2013-01-31
 p date.precision               #=> 0
 p date.prev                    #=> 2013-01-31

定数 P1D の値は When::TM::PeriodDuration.new(1, DAY) である

加減算で Integer は When::TM::PeriodDuration に暗黙変換される

何ヶ月後、何ヶ月前の日付を求める

 date = [2013, 1, 31].tm_pos
 p date + P1M                     #=> 2013-02-28
 p date + 1.month_period_duration #=> 2013-02-28
 date = [2013, 1].tm_pos
 p date.precision                 #=> -1
 p date.succ                      #=> 2013-02

 date = [2013, 3, 31].tm_pos
 p date - P1M                     #=> 2013-02-28
 p date - 1.month_period_duration #=> 2013-02-28
 date = [2013, 2].tm_pos
 p date.precision                 #=> -1
 p date.prev                      #=> 2013-01

定数 P1M の値は When::TM::PeriodDuration.new(1, MONTH) である

日付の精度が“月”の場合、prev, succ は“月”単位で前後を求める

2つの日付の差を求める

 date1 = [2012, 6,30].tm_pos
 date2 = [2012, 7, 1].tm_pos
 p date2 - date1         #=> P1D
 p (date2 - date1).class #=> When::TM::PeriodDuration

精度が“日”または“日”よりも粗い日付の差は When::TM::PeriodDuration になる

日付オブジェクトの年号・年月日・曜日を個別に扱う

暦年代なし

 date = [2013, 5,24].tm_pos
 p date                             #=> 2013-05-24
 p date[YEAR]                       #=> 2013
 p date[MONTH]                      #=> 5
 p date[DAY]                        #=> 24
 p date.year                        #=> 2013
 p date.month                       #=> 5
 p date.day                         #=> 24
 p date.wday                        #=> 5

暦年代あり

 date = ['H', 27, 1, 15].tm_pos
 p date                             #=> H27(2015).01.15
 p date[YEAR]                       #=> 27
 p date[MONTH]                      #=> 1
 p date[DAY]                        #=> 15
 p date.year                        #=> 27
 p date.month                       #=> 1
 p date.day                         #=> 15
 p date.wday                        #=> 4
 p date.most_significant_coordinate #=> 2015
 puts date.calendar_era_name        #=> H

うるう年かどうか判定する

 p date.length(YEAR) == 366         #=> false

文字列の日付を日付オブジェクトに変換する

 p when?('2013-05-24') #=> 2013-05-24

日時

現在の日時を取得する

 time = now
 p time         #=> 2013-05-24T06:03:10.5Z

日時オブジェクトを生成する

 time = [2013, 5,24, 6, 3, 10.5].tm_pos
 p time         #=> 2013-05-24T06:03:10.5Z
 p time[YEAR]   #=> 2013
 p time[MONTH]  #=> 5
 p time[DAY]    #=> 24
 p time[HOUR]   #=> 6
 p time[MINUTE] #=> 3
 p time[SECOND] #=> 10.5
 p time.year    #=> 2013
 p time.month   #=> 5
 p time.day     #=> 24
 p time.hour    #=> 6
 p time.min     #=> 3
 p time.sec     #=> 10.5
 p time.wday    #=> 5

日時中の曜日を日本語に変換する

 p time.strftime('%A', 'ja')            #=> "金曜日"
 p ('Week'.residue % time).to_m17n/'ja' #=> "金曜日(4)"

UTCとローカル時刻の日時オブジェクト

 utc = [2013, 5,24, 6, 3, 11].tm_pos
 p utc          #=> 2013-05-24T06:03:11Z
 jst = [2013, 5,24, 6, 3, 11].tm_pos(:clock=>'+09:00')
 p jst          #=> 2013-05-24T06:03:11+09:00

日時オブジェクトを文字列に変換する

 p jst.to_s     #=> "2013-05-24T06:03:11+09:00"

日時を任意のフォーマットで扱う

 p jst.strftime("Now, %A %B %d %X %Y", 'fr') #=> "Now, vendredi mai 24 06:03:11 2013"

日本時間をニューヨーク時間に変換する

 if Object.const_defined?(:TZInfo) # TZInfo gem がインストールされていること
   jst = [1997, 4, 6, 15, 30, 00].tm_pos(:tz=>'Asia/Tokyo')
   p jst        #=> 1997-04-06T15:30:00+09:00
   est = 'America/New_York'.clock ^ jst
   p est        #=> 1997-04-06T01:30:00-05:00
   jst = [1997, 4, 6, 16, 30, 00].tm_pos(:tz=>'Asia/Tokyo')
   p jst        #=> 1997-04-06T16:30:00+09:00
   edt = 'America/New_York'.clock ^ jst
   p edt          #=> 1997-04-06T03:30:00-04:00
 end
使用可能な時間帯の一覧は When::Parts::Timezone.tz_info.keys で取得できる

日時に任意の時間を加減する

 utc = [2012, 6,30, 0, 0, 0].tm_pos
 p utc          #=> 2012-06-30T00:00:00Z
 p utc + 1      #=> 2012-07-01T00:00:00Z
 p utc + 1.0    #=> 2012-06-30T23:59:60Z

加減算で Integer は When::TM::PeriodDuration に暗黙変換される

加減算で Float は When::TM::IntervalLength に暗黙変換される

2つの日時の差を求める

 utc1 = [2012, 6,30, 0, 0, 0].tm_pos
 utc2 = [2012, 7, 1, 0, 0, 0].tm_pos
 p utc2 - utc1         #=> 86401.0s
 p (utc2 - utc1).class #=> When::TM::IntervalLength

精度が“日”よりも細かい日時の差は When::TM::IntervalLength になる

UNIXタイムを日時オブジェクトに変換する

 p when?(Time.at(1267867237)) #=> 2010-03-06T18:20:37.00+09:00