日付を扱うためにはDateクラス、時刻を扱うためにはTimeクラスが用意されています。Dateクラスを使うためにはrequire ‘date’する必要があります。

現在の時刻を取得する

Time#nowメソッドにより現在の時刻を取得することができます。Time#nowメソッドはTimeオブジェクトを返却します。

 day = Time.now
 p day #=> "Sun May 20 23:48:45 JST 2001"
 p day.year #=> 2001
 p day.month #=> 5
 p day.day #=> 20
 p day.hour #=> 23
 p day.min #=> 48
 p day.sec #=> 45
 p day.wday #=> 0

時刻オブジェクトを作成する

Time#gmメソッド、Time#utcメソッドにより協定世界時をTime#localメソッド、Time#mktimeメソッドによりローカルタイムのTimeオブジェクトを作成することができます。

 day = Time.gm(2001, 5, 20, 23, 59, 59) #=> Sun May 20 23:59:59 UTC 2001
 day = Time.local(2001, 5, 20, 23, 59, 59) #=> Sun May 20 23:59:59 JST 2001

時刻を任意のフォーマットで扱う

Time::strftimeメソッドにより、時刻を指定されたフォーマットに従って変換することができます。フォーマットとして指定できるものは以下の通りです。

%A 曜日の名称(Sunday, Monday … )
%a 曜日の省略名(Sun, Mon … )
%B 月の名称(January, February … )
%b 月の省略名(Jan, Feb … )
%c 日付と時刻
%d 日(01-31)
%H 24時間制の時(00-23)
%I 12時間制の時(01-12)
%j 年中の通算日(001-366)
%M 分(00-59)
%m 月を表す数字(01-12)
%p 午前または午後(AM,PM)
%S 秒(00-60) (60はうるう秒)
%U 週を表す数.最初の日曜日が第1週の始まり(00-53)
%W 週を表す数.最初の月曜日が第1週の始まり(00-53)
%w 曜日を表す数.日曜日が0(0-6)
%X 時刻
%x 日付
%Y 西暦を表す数
%y 西暦の下2桁(00-99)
%Z タイムゾーン trap
%% %自身
 day = Time.now
 p day.strftime("Now, %A %B %d %X %Z %Y") #=> "Now, Sunday May 20 23:33:37 JST 2001"
 Time.now.strftime("%Y-%m-%d %H:%M:%S") #=> "2009-03-01 00:31:21"

時刻オブジェクトを文字列に変換する

Time#to_sメソッドにより時刻オブジェクトを文字列へ変換することができます。

 day = Time.now
 p day.to_s #=> "Now, Sunday May 20 23:33:37 JST 2001"

時刻に任意の時間を加減する

Time#+メソッド、Time#-メソッドにより時刻オブジェクトに任意の時間(秒指定)を加減することができます。

 day = Time.local(2001, 5, 20, 23, 59, 59) #=> Sun May 20 23:59:59 JST 2001
 day = day + 1 #=>  Mon May 21 00:00:00 JST 2001
 
 day = Time.local(2000, 12, 31, 0, 0, 0) #=> Sun Dec 31 00:00:00 JST 2000
 day = day + 24*60*60 #=>  Mon Jan 01 00:00:00 JST 2001

2つの時刻の差を求める

Time#+メソッド、Time#-メソッドにより2つの日付の差を求めることができます。

 day1 = Time.local(2000, 12, 31, 0, 0, 0) #=> Sun Dec 31 00:00:00 JST 2000
 day2 = Time.local(2001, 1, 2, 12, 30, 0) #=> Tue Jan 02 12:30:00 JST 2001
 
 days = (day2 - day1).divmod(24*60*60) #=> [2.0, 45000.0]
 hours = days[1].divmod(60*60) #=> [12.0, 1800.0]
 mins = hours[1].divmod(60) #=> [30.0, 0.0]
 
 puts "#{days[0].to_i} days + #{hours[0].to_i} hours + #{mins[0].to_i} minutes + #{mins[1]} seconds" #=> "2 days + 12 hours + 30 minutes + 0.0 seconds"

時刻中の曜日を日本語に変換する

Time#wdayメソッドにより曜日を数値で取得することができます。wdayの値は0が日曜日で、6が土曜日に対応します。これにより、例えば以下のようにして曜日を日本語で得ることができます。

 wdays = ["日", "月", "火", "水", "木", "金", "土"]
 
 day = Time.now #=> Sun Dec 31 00:00:00 JST 2000
 p "今日は#{wdays[day.wday]}曜日です" #=> "今日は日曜日です"

UNIXタイムをTimeオブジェクトに変換する

 Time.at(1267867237) #=> Sat Mar 06 18:20:37 +0900 2010

逆は、

 Time.now.to_i #=> 1267867237

現在の日付を求める

Date::todayメソッドにより現在の日付を取得することができます。

 require 'date'
 
 day = Date.today
 p day.to_s #=> "2001-05-20"

日付オブジェクトを文字列に変換する

Date#to_sメソッドにより日付オブジェクトをISO 8601:1988書式(CCYY-MM-DD)形式に変換することができます。

 require 'date'
 
 day = Date::today
 p day.to_s #=> "2001-05-20"

日付オブジェクトを作成する

Date::newメソッドにより暦日付に相当する日付オブジェクトを作成することができます。

 require 'date'
 
 day = Date::new(2001, 5, 31)
 p day.to_s #=> "2001-05-31"

指定の日付が存在するかどうか調べる

Date::exist?メソッドは、指定された日付が正しい暦日付であれば相当するユリウス日を返却し、そうでなければ偽を返します。

 require 'date'
 
 p Date::exist?(2001, 1, 31) #=> 2451941
 p Date::exist?(2001, 1, 32) #=> false

ユリウス日から日付オブジェクトを作成する

Date::new1メソッドによりユリウス日から日付オブジェクトを作成することができます。ユリウス日は紀元前4713年1月1日 (ユリウス暦) 正午 (グリニッジ平均時) を暦元とした通日 (経過日数) です。

 require 'date'
 
 julius = Date::exist?(2001, 1, 31) #=> 2451941
 day = Date::new1(julius)
 p day.to_s #=> "2001-01-31"

何日後、何日前の日付を求める

Date#+メソッド、Date#-メソッドにより何日後、何日前の日付を求めることができます。

 require 'date'
 
 day = Date.new(2001, 5, 31)
 day = day + 1
 p day.to_s #=> "2001-06-01"
 
 day = Date.new(2001, 1, 1)
 day = day - 1
 p day.to_s #=> "2000-12-31"

またDate#succメソッド、Date#nextメソッドで翌日の日付を求めることができます。

 require 'date'
 
 day = Date.new(2001, 5, 31)
 day = day.succ
 p day.to_s #=> "2001-06-01"
 
 day = day.next
 p day.to_s #=> "2001-06-02"

何ヶ月後、何ヶ月前の日付を求める

Date#»メソッド、Date#«メソッドにより何ヶ月後、何ヶ月前の日付を求めることができます。

 require 'date'
 
 day = Date.new(2001, 1, 31)
 day = day >> 1
 p day.to_s #=> "2001-2-28"
 
 day = Date.new(2001, 5, 31)
 day = day << 1
 p day.to_s #=> "2001-04-30"

うるう年かどうか判定する

Date#leap?メソッドにより閏年かどうか判定することができます。

 require 'date'
 
 day = Date.new(2000)
 p day.leap? #=> true
 
 day = Date.new(2001)
 p day.leap? #=> false

日付オブジェクトの年月日・曜日を個別に扱う

Date#yearメソッド、Date#monthメソッド、Date#dayメソッド、Date#wdayメソッドにより日付オブジェクトの年月日、曜日を個別に扱うことができます。

 require 'date'
 
 day = Date::new(2001, 1, 31)
 p day.year #=> 2001
 p day.month #=> 1
 p day.day #=> 31
 p day.wday #=> 3

文字列の日付を日付オブジェクトに変換する

ParseDate?モジュールを使うと文字列で与えられた日付を解析し、配列(年、月、日、時、分、秒、タイムゾーン、曜日)で取得することができます。

ParseDate?モジュールを使うにはrequire ‘parsedate’する必要があります。

以下の例では文字列で与えられた日付をParseDate?で解析し、Timeオブジェクトに変換しています。

 require 'parsedate'
 
 ary = ParseDate::parsedate("Thu May 24 22:56:30 JST 2001") #=> [2001, 5, 24, 22, 56, 30, "JST", 4]
 t = Time::local(*ary[0..-3]) #=> Thu May 24 22:56:30 JST 2001

以下の方法でも可能です

 require 'date'
 p Date.strptime("2003/04/18", "%Y/%m/%d") #=> #<Date: 4905495/2,0,2299161>