date2 の紹介

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.rbgtkcal.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

よくある質問

time(3) に相当する値を得るには?

裏技的ですが、aDate.strftime('%s').to_i とするのが簡単です。

Time オブジェクトにしたいんだけど?

最新版では、aDate.to_time とすることができます。 Date、DateTime、Time のそれぞれに、to_date、to_datetime、to_time が 定義されています。

ドイツ人なんだけど、parse などで、 日付が米国式に解釈されて不満なんだけど? (dd/mm/yy と書いたつもりでも、mm/dd/yy とされる)

今のところ、よい対策がありません。 とりあえず、なんでもかんでも parse に頼らないで、 strftime がつかえないか検討してみてください。


ふなばただよし 2002-2005
更新日時: 2006-10-24T14:23:02+09:00