RubyのTimeクラスを使ってみる

CentOSにRuby2.1.1をインストールする
の続き

RubyのTimeクラスを使ってみる。

生成

Timeオブジェクトの様々な生成方法。

p Time.new                         #=> 2014-05-09 12:01:33 +0900  # 現在日時のTimeオブジェクトを生成する
p Time.now                         #=> 2014-05-09 12:01:33 +0900  # newと同様
p Time.local(1999,12,31,23,59,59)  #=> 1999-12-31 23:59:59 +0900  # 指定の日時で生成する
p Time.local(1999)                 #=> 1999-01-01 00:00:00 +0900  # 省略可
p Time.mktime(1999,12,31,23,59,59) #=> 1999-12-31 23:59:59 +0900  # localと同様
p Time.gm(1999,12,31,23,59,59)     #=> 1999-12-31 23:59:59 UTC    # 協定世界時
p Time.utc(1999,12,31,23,59,59)    #=> 1999-12-31 23:59:59 UTC    # gmと同様
p Time.at(Time.now)                #=> 2014-05-09 12:01:33 +0900  # Timeオブジェクトから生成
p Time.at(0)                       #=> 1970-01-01 09:00:00 +0900  # 1970/1/1〜の経過秒数で生成

日時の文字列からTimeオブジェクトを生成したい場合は、
requireでtimeを指定する必要がある。

require "time"
p Time.parse("1999-12-31 23:59:59")     #=> 1999-12-31 23:59:59 +0900

各種情報の取得

Timeオブジェクトから取得できる各種情報。

t = Time.local(1999,12,31,23,59,59)
p t.year        #=> 1999    # 年
p t.month       #=> 12      # 月
p t.day         #=> 31      # 日
p t.hour        #=> 23      # 時
p t.min         #=> 59      # 分
p t.sec         #=> 59      # 秒
p t.wday        #=> 5       # 曜日の番号(0:日,1:月,…,6:土)
p t.yday        #=> 365     # 1月1日からの通算日
p t.zone        #=> "JST"   # タイムゾーン

経過秒数の取得

Timeオブジェクトの経過秒数の取得。

t = Time.now
p t.to_i        #=> 1399605420          # 経過秒数を整数で取得
p t.tv_sec      #=> 1399605420          # to_iと同様
p t.to_f        #=> 1399605420.8634932  # 経過秒数を小数で取得
p t.tv_usec     #=> 863493              # 小数の部分を取得

文字列への変換

strftimeで文字列に変換できる。
基本的なフォーマットは下記の通り。

%Y 年(4桁)
%m
%d
%H 時(24時間制)
%M
%S


0で埋めない場合は、「-(ハイフン)」を付ける。

t = Time.local(1999,1,2,3,4,5)
p t.strftime("%Y/%m/%d %H:%M:%S")         #=> "1999/01/02 03:04:05"
p t.strftime("%Y/%-m/%-d %-H:%-M:%-S")    #=> "1999/1/2 3:4:5"

その他のフォーマット。

t = Time.local(1999,1,2,3,4,5)
p t.strftime("%A")      #=> "Saturday"    # 曜日の名称
p t.strftime("%a")      #=> "Sat"         # 曜日の省略名
p t.strftime("%B")      #=> "January"     # 月の名称
p t.strftime("%b")      #=> "Jan"         # 月の省略名
p t.strftime("%c")      #=> "Sat Jan  2 03:04:05 1999"    # 日付と時刻
p t.strftime("%j")      #=> "002"         # 1/1からの通算日
p t.strftime("%p")      #=> "AM"          # AM/PM
p t.strftime("%U")      #=> "00"          # 週を表す数(日曜始まり)
p t.strftime("%W")      #=> "00"          # 週を表す数(月曜始まり)
p t.strftime("%w")      #=> "6"           # 曜日を表す数
p t.strftime("%X")      #=> "03:04:05"    # 時刻
p t.strftime("%x")      #=> "01/02/99"    # 日付
p t.strftime("%y")      #=> "99"          # 年(下2桁)
p t.strftime("%Z")      #=> "JST"         # タイムゾーン
p t.strftime("%%")      #=> "%"           # %

演算

Timeオブジェクトには秒数を加算したり減算したりすることができる。

t = Time.local(1999,12,31,23,59,59)
p t + 1                   #=> 2000-01-01 00:00:00 +0900
p t - 24*60*60            #=> 1999-12-30 23:59:59 +0900

Timeオブジェクトの差分も取ることができる。

t1 = Time.local(2014)
t2 = Time.now
p t2                      #=> 2014-05-09 12:39:27 +0900
p t2 - t1                 #=> 11104767.199060874
p (t2 - t1) / (24*60*60)  #=> 128.52739813727862    # 日数に変換

active_support

Railsのactive_supportを使うと、日時をより便利に扱うことができる。

Railsが必要なのでインストールする。

$ sudo gem install --no-ri --no-rdoc rails

active_supportを使うには'active_support/all'をrequireする必要がある。

require 'active_support/all'

active_supportを使うと、過去や未来の日時を色々取得できる。

p Time.now                #=> 2014-05-09 12:43:49 +0900
p 1.hour.ago              #=> 2014-05-09 11:43:49 +0900    # 1時間前
p 2.days.since            #=> 2014-05-11 12:43:49 +0900    # 2日後
p 3.week.ago              #=> 2014-04-18 12:43:49 +0900    # 3週間前
p 3.month.since           #=> 2014-08-09 12:43:49 +0900    # 4ヶ月後
p 4.years.ago             #=> 2010-05-09 12:43:49 +0900    # 5年前

t = Time.now
p t                       #=> 2014-05-09 12:43:49 +0900

p t - 1.hour              #=> 2014-05-09 11:43:49 +0900    # 1時間前
p t + 2.days              #=> 2014-05-11 12:43:49 +0900    # 2日後
p t - 3.week              #=> 2014-04-18 12:43:49 +0900    # 3週間前
p t + 4.month             #=> 2014-09-09 12:43:49 +0900    # 4ヶ月後
p t - 5.years             #=> 2009-05-09 12:43:49 +0900    # 5年前

p t.yesterday             #=> 2014-05-08 12:43:49 +0900    # 昨日
p t.tomorrow              #=> 2014-05-10 12:43:49 +0900    # 明日
p t.prev_week             #=> 2014-04-28 00:00:00 +0900    # 先週
p t.next_month            #=> 2014-06-09 12:43:49 +0900    # 来月
p t.prev_year             #=> 2013-05-09 12:43:49 +0900    # 去年

beginning_of_…やend_of_…で、様々な最初や最後の日時が取得できる。

t = Time.now
p t                       #=> 2014-05-09 12:51:12 +0900

p t.beginning_of_day      #=> 2014-05-09 00:00:00 +0900    # 日の初め
p t.end_of_day            #=> 2014-05-09 23:59:59 +0900    # 日の終わり
p t.beginning_of_week     #=> 2014-05-05 00:00:00 +0900    # 週の初め
p t.end_of_week           #=> 2014-05-11 23:59:59 +0900    # 週の終わり
p t.beginning_of_month    #=> 2014-05-01 00:00:00 +0900    # 月の初め
p t.end_of_month          #=> 2014-05-31 23:59:59 +0900    # 月の終わり
p t.beginning_of_year     #=> 2014-01-01 00:00:00 +0900    # 年の初め
p t.end_of_year           #=> 2014-12-31 23:59:59 +0900    # 年の終わり

Time::DATE_FORMATSを使うと、文字出力用のフォーマットを登録しておくことができる。

Time::DATE_FORMATS[:type1] = "%Y-%m-%d %H:%M:%S"
Time::DATE_FORMATS[:type2] = "%y/%m/%d"
Time::DATE_FORMATS[:type3] = "%Y年%m月%d日 %H時%M分%S秒"

t = Time.now
p t.to_s(:type1)          #=> "2014-05-09 12:55:02"
p t.to_s(:type2)          #=> "14/05/09"
p t.to_s(:type3)          #=> "2014年05月09日 12時55分02秒"