RubyのTimeクラスを使ってみる
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秒"