date2 は、ruby のための日付クラスです。 きっと日付の計算に便利です。
date2 をつかうには、はじめに
require 'date'
として、ライブラリを読みこみましょう。
日付 (年月日) を与えて日付オブジェクトを作成するには、Date::new をつかいます。
d = Date.new(2002, 5, 28)
=> #<Date: 4904835/2,0,2299161>
(to_s: "2002-05-28")
これで、2002年5月28日のオブジェクトが作成されました。 今日の日付オブジェクトを作成するには、Date::today をつかいます。
d = Date.today
=> #<Date: 4904835/2,0,2299161>
(to_s: "2002-05-28")
日付 (年月日) と時刻 (時分秒) を与えて日時オブジェクトを作成するには、 DateTime::new をつかいます。
t = DateTime.new(2002, 5, 28, 15, 10, 56)
=> #<DateTime: 3310771229/1350,0,2299161>
(to_s: "2002-05-28T15:10:56Z")
これで、2002年5月28日15時10分56秒 (協定世界時) のオブジェクトが作成されました。 もし、協定世界時より9時間進んでいる日本標準時を表現したいなら、 つぎのようにします。
t2 = DateTime.new(2002, 5, 28, 15, 10, 56, 9.to_r/24)
=> #<DateTime: 13243082891/5400,3/8,2299161>
(to_s: "2002-05-28T15:10:56+0900")
現在の日時オブジェクトを作成するには、DateTime::now をつかいます。
t2 = DateTime.now
=> #<DateTime: 13243082891/5400,3/8,2299161>
(to_s: "2002-05-28T15:10:56+0900")
クラスメソッド new に、存在しない日付を与えると例外になりますが、 ただ、検査をしたいだけなら、クラスメソッド valid_date? をつかうことができます。
Date.valid_date?(2002, 2, 29)
=> nil
年月日をそれぞれ得るには、メソッド year、mon、mday をつかいます。
d.year
=> 2002
d.mon
=> 5
d.mday
=> 28
つぎのようにすれば、月の英語名を得ることができます。
d.strftime('%B')
=> "May"
時分秒をそれぞれ得るには、メソッド hour、min、sec をつかいます。
t.hour
=> 15
t.min
=> 10
t.sec
=> 56
曜日を得るには、メソッド wday をつかいます。
d.wday
=> 2
この日は、火曜日 (2) だと判ります。 また、つぎのようにすれば、英語名を得ることができます。
d.strftime('%A')
=> "Tuesday"
たとえば、90日後の日付を得たいなら、つぎのようにします。
d2 = d + 90
=> #<Date: 4905025/2,0,2299161>
(to_s: "2002-08-26")
また、90日前なら、このようにします。
d3 = d - 90
=> #<Date: 4904665/2,0,2299161>
(to_s: "2002-02-27")
d2 と d3 の日差は、つぎのように求められます。
d2 - d3
=> Rational(180, 1)
(to_s: "180")
もし、一ヶ月後の今日を得たいなら、つぎのようにします。
d >> 1
=> #<Date: 4904907/2,0,2299161>
(to_s: "2002-06-28")
一ヶ月前の今日なら、こうです。
d << 1
=> #<Date: 4904785/2,0,2299161>
(to_s: "2002-04-28")
その月に該当日が存在しない場合は、晦日に丸められます。 たとえば、2002年1月31日の一ヶ月後を求めると、2002年2月28日になります。
日付をあらわす文字列を与えて、オブジェクトを作成することもできます。
d = Date.parse('2002-05-28')
=> #<Date: 4904835/2,0,2299161>
(to_s: "2002-05-28")
t = DateTime.parse('Tue, 28 May 2002 15:10:56 -0700')
=> #<DateTime: 13243086491/5400,-7/24,2299161>
(to_s: "2002-05-28T15:10:56-0700")
クラスメソッド parse は、多くの書式を柔軟に解釈しますが、 あらゆる書式をあつかえるわけではありません。 書式があらかじめ判っているのなら、 クラスメソッド strptime をつかうこともできます。
d = Date.strptime('2002/05/28', '%Y/%m/%d')
=> #<Date: 4904835/2,0,2299161>
(to_s: "2002-05-28")
t = DateTime.strptime('2002/05/28 15:10:56 PDT', '%Y/%m/%d %H:%M:%S %Z')
=> #<DateTime: 13243086491/5400,-7/24,2299161>
(to_s: "2002-05-28T15:10:56-0700")
ただ、解析したいだけで、日付オブジェクトが必要ないなら、 クラスメソッド _parse、_strptime がつかえます。 また、ParseDate モジュールをつかうこともできます。
Date._parse('2002-05-28')
=> {:mon=>5, :year=>2002, :mday=>28}
Date._strptime('2002-05-28', '%Y-%m-%d')
=> {:mon=>5, :year=>2002, :mday=>28}
require 'parsedate'
ParseDate.parsedate('2002-05-28')
=> [2002, 5, 28, nil, nil, nil, nil, nil]
クラスメソッド strptime と同じ書式を用いて、日付を書式づけることもできます。
d.strftime('%Y/%m/%d')
=> "2002/05/28"
ある年が閏年かどうかは、Date::leap? で調べることができます。
Date.leap?(2002)
=> false
2002年は、平年 (false) だと判ります。 ある日付が含まれる年が閏年かどうかも判定できます。
Date.new(2002, 1, 1).leap?
=> false
ところで、閏年であるかどうかを調べる理由はなんでしょう? もし、月の最後の日を確認したいだけなら、つぎのようにしてもいいでしょう。
Date.new(2002, 2, -1).mday
=> 28
同様に年の最後の日を確認することもできます。
Date.new(2002, -1, -1).yday
=> 365
はじめに、
require 'date/holiday'
として、祝祭日関連のコードを読みこんでおきましょう。
我が国の祝日法が定める祝日は、メソッド national_holiday? で判定できます。 (応用例 ncal.rb、 gtkcal.rb)
d.national_holiday?
=> false
ある年の復活祭の日曜日は、クラスメソッド easter で求めることができます。 (応用例 goodfriday.rb)
e = Date.easter(2002)
=> #<Date: 2452365,0,2299161>
(to_s: "2002-03-31")
ある日が復活祭の日曜日かどうかは、メソッド easter? で判定できます。
d.easter?
=> false
もし、2002年5月の第2月曜日が知りたいなら、つぎのようにできます。 (応用例 daylight.rb)
Date.nth_kday(2, 1, 2002, 5)
=> #<Date: 2452408,0,2299161>
(to_s: "2002-05-13")
また、ある日が第2月曜日かどうかは、メソッド nth_kday? で判定できます。
d.nth_kday?(2, 1)
=> false
裏技的ですが、aDate.strftime('%s').to_i とするのが簡単です。
最新版では、aDate.to_time とすることができます。 Date、DateTime、Time のそれぞれに、to_date、to_datetime、to_time が 定義されています。
今のところ、よい対策がありません。 とりあえず、なんでもかんでも parse に頼らないで、 strftime がつかえないか検討してみてください。
ふなばただよし 2002-2005
更新日時: 2006-10-24T14:23:02+09:00