2007年12月15日土曜日

Rubyの Dateと Timeと DateTimeの比較

RubyのTimeクラスとDateクラス、DateTimeクラスの比較。
Timeクラスはtime.rbを読み込まなかった場合で比較。


Time

  • 日付と時間を扱う
  • 組み込みクラス(requireしなくても使える)
  • 現在日時で生成するには、Time.now
  • 日時を指定して生成するには、Time.gm(...) or Time.utc(...) or Time.local(...) or Time.mktime(...)
  • 文字列に変換すると、C言語のctime()に準じた形式になる (例:Tue Dec 11 15:25:35 +0900 2007 )

Date
  • 日付を扱う
  • 使うには require "date" する必要がある
  • 現在日付で生成するには、Date.today
  • 日付を指定して生成するには、Date.new(...)
  • 文字列に変換すると、ISO8601形式になる (例:2007-12-11 )

DateTime
  • 日付と時間を扱う
  • Dateクラスのサブクラス。使うには require "date" する必要がある
  • 現在日時で生成するには、DateTime.now
  • 日時を指定して生成するには、DateTime.new(...)
  • 文字列に変換すると、ISO8601形式になる (例:2007-12-11T15:31:30+0900 )


補足
  • 日時を表す文字列から日時情報を取り出すには、ParseDate::parsedate()が使える。(日付だけならDate.strptime()でもできる。)
    require "parsedate"
    p ParseDate::parsedate("Tue 18, Dec 2007 15:52:30 +0900")
    #=> [2007, 12, 18, 15, 52, 30, "+0900", 2]
  • DateTimeクラスでタイムゾーンを指定するには、Rationalクラスを使う。Ratinalの第1引数にタイムゾーンの時間差、第2引数には24を指定する。
    require "date"

    # 生成時に指定する場合

    d = DateTime.new(2007, 12, 18, 15, 57, 30, Rational(9, 24))
    print d #=> 2007-12-18T15:57:30+0900

    # 後から指定する場合
    d2 = d.new_offset(Rational(-5, 24))
    print d2 #=> 2007-12-18T15:57:30-0500
  • 標準添付のtime.rbを読み込む(require "time")と、いろいろ便利なメソッドが使える。
    require "time"

    # 日時の文字列をパース
    t = Time.parse("2007-12-11T18:21+09:00")

    # RFC2822形式で出力
    print t.rfc2822 #=> Tue, 11 Dec 2007 18:21:00 +0900

    # ISO8601形式で出力
    print t.iso8601 #=> 2007-12-11T18:21:00+09:00



参考
 逆引きRuby - 日付と時刻
 日付の表記に関するノート
 DateTimeにタイムゾーンを設定する。 - こせきの技術日記
 Rubyで日付・時間を操作 - I sort my thought...

0 件のコメント:

ブログ アーカイブ

tags