chroju.dev/blog

the world as code

Ruby基礎復習(7) Timeクラス

『パーフェクトRuby』p.190より。

Time#nowTime#newで現在時刻が取得可能。

now = Time.now # => 2015-03-16 23:25:32 +0900
new = Time.new # => 2015-03-16 23:25:32 +0900

now.zone # => "JST"
now.getutc # => 2015-03-16 14:25:32 UTC
now.utc
now.zone # => "UTC"

現在時刻以外のTimeオブジェクトを生成するにはTime#atでUNIX秒を引数に指定するか、Time#utcTime#localで直接時刻を指定する。

Time.at(0) # => 1970-01-01 09:00:00 +0900
Time.utc(2015, 1, 1, 2, 30, 40, 100) # => 2015-01-01 02:30:40 UTC (最後の100はマイクロ秒)
Time.local(2015, 1, 1, 2, 30, 40, 100) # => 2015-01-01 02:30:40 +0900

#to_i#to_f#to_rの戻り値はUNIX秒。#to_sで文字列表現が返る。#to_aは秒、分、時、日、月、年、曜日、その年の通算日数、夏時間の真偽判定、タイムゾーンの配列を返す。なお、この配列フォーマットを展開してTime#utcTime#localの引数として与えることもできる。

now.to_i # => 1426515932
now.to_f # => 1426515932.978824
now.to_r # => (178314491622353/125000)
now.to_s # => "2015-03-16 23:25:32 +0900"
now.to_a # => [32, 25, 23, 16, 3, 2015, 1, 75, false, "JST"]

#to_sの戻り値は上記フォーマットの固定だが、任意のフォーマットで文字列表現を得たい場合は#strftimeを使う。使えるフォーマット文字列は公式ドキュメント参照で。

now.strftime("今日は%Y年%m月%d日、今は%H時%M分を%S秒過ぎたところです。") # => "今日は2015年3月16日、今は23時25分を32秒過ぎたところです。"

逆に文字列表現からTimeオブジェクトを得たい場合は#strptimeが使える。

参照

その他もろもろの出力。

now.year # => 2015
now.month # => 3
now.day # => 16
now.hour # => 23
now.min # => 25
now.sec # => 32
now.nsec # => 978824000 (ナノ秒)
now.wday # => 1 (曜日は日曜を0としてカウント)
now.yday # => 75 (年初からの日数)

曜日やサマータイム(DST)については疑問符のメソッドで真偽判定できる。

now.dst? # => false
now.sunday? # => false
now.monday? # => true

Timeオブジェクト同士の比較についてはナノ秒まで判定されるので、そのあたりに注意とのこと。以下のようなことがあり得る。

now = Time.now # => 2015-03-16 23:25:32 +0900
new = Time.new # => 2015-03-16 23:25:32 +0900

now == new # => false

整数を与えることによる加算減算は秒として取り扱われる。Timeオブジェクト同士の減算も可能。その場合は差分の秒数が浮動小数点数で返る。

now = Time.now # => 2015-03-16 23:25:32 +0900

now + 1 # => 2015-03-16 23:25:33 +0900
now - 1 # => 2015-03-16 23:25:31 +0900

なお時間や日時を扱うクラスには他にDateDateTimeもあるが、組み込みのライブラリはこのTimeだけ。どれを使えばええんや?ってのは、探してみたら大変詳しいQiitaを見つけたんでそっちに譲ります。

参考