Ruby/日時操作

Ruby/日時操作

日時操作に関して

クラス

Timeクラス

昔ながらの日時を示すクラス。

便利なメソッドが沢山搭載されているが・・・昔ながらなので・・・・1970年以前2038年以降の時刻を扱うことができない・・・実質できないがそれは実装の依存であって設計思想としては特に制限は無い

Dateクラス

日付を管理するクラス。

DateTimeクラス

日時を管理するクラス。こいつをつかっとけば間違い無いかな。

操作

加算

日付を加算

DateTimeでは普通に+で足せば日付を未来にズラすことができる。これは破壊的ではない

t = DateTime.new(2009, 10, 11, 12)
t = t + 1
p t.to_s

時間を加算する

1を加算したら1日進むわけだから、1/24加算すれば1時間進むというインターフェースになっている。

t = DateTime.new(2009, 10, 11, 12)
p t.to_s
t = t + Rational(1, 24)
p t.to_s

月を加算

このメソッドで月を加算する。»の方向が未来に向いているという意味なのかな・・・ 非破壊的な挙動

t = DateTime.new(2009, 10, 11, 12)
p t.to_s
t = t >> 1
p t.to_s

月を戻すにはマイナス値を渡せばよい

↓のような2月のように他の月よりも日数が少ない月に減算する場合・・・

t = DateTime.new(2010, 3, 31)
p t.to_s
t = t >> -1
p t.to_s

この場合は最終的にtの値は2010-02-28のように月末に丸められる。

時刻を指定のフォーマットで文字列に変換する

t = Time.local(2008,8,24)
puts t.strftime("%Y年%m月%d日") #=>2008年08月24日

フォーマットの指定の仕方はここを参考

%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
タイムゾーン
%%
%自身

DateTimeも同様のメソッドを持っている

Time - Rubyリファレンスマニュアル

任意のタイムゾーンで時刻を出力する

Ruby 2.0.0 で動作確認OK active_supportのin_time_zoneメソッドを使うと出力用のtimezoneをコントロールできるようになる

require 'rubygems'
require 'active_support/all'
p Time.now.in_time_zone('America/Chicago').strftime("%Y%m%d%H%M%S")

in_time_zoneで戻ってくるのはActiveSupport::TimeWithZoneのオブジェクト

ある期間の日数を計算する

require 'date'
hoge = Date.new(2008, 1, 1)
piyo = Date.new(2008, 1, 3)
p (piyo - hoge).to_i

ある期間の秒数を計算する

DateTime同士の演算は答えが1日という時間の何分の一の大きさかという値で出てくる。 なのでその値に一日の秒数を掛ければ期間の秒数を求めることができる。

require 'date'
hoge = DateTime.new(2009, 1, 1, 0, 10, 0)
piyo = DateTime.new(2009, 1, 1, 0,  9, 0)
p (hoge - piyo) * 24 * 60 * 60 #=> 60

秒よりも細かい値を取得する

Timeクラスはマイクロ秒(1/1000000秒)単位までの細かさで値を保持しているので

t = Time.now
p t.usec #=> 1234000

とかで取れる

っが・・・実際はミリ秒単位ぐらいまでしか精度がないっぽ

ユニーク値のための時刻の利用

t = Time.now
p t.strftime("%Y%m%d%H%M%S") + t.usec.to_s

今月の一日(ついたち、いっぴ)オブジェクトを作る

require 'date'
hoge = Date.new(Date.today.year, Date.today.mon, 1)

今月の月末日オブジェクトを作る

Dateクラスのコンストラクタでマイナス値を突っ込むと逆から計算してくれるので-1を入れると月末が取れる

require 'date'
hoge = Date.new(Date.today.year, Date.today.mon, -1)

日付から曜日を求める

結果は数値で返ってきて、1が月曜で7が日曜

require 'date'
hoge = Date.new(2008, 1. 20)
puts hoge.cwday.to_s   #=> 7

日付を列挙する

一年分

require 'date'
start_date = Date.new(2008, 1, 1);
end_date = Date.new(2008, 12, 31);
(start_date..end_date).each do |a_day|
  puts a_day.to_s
end

同様の操作をDateTimeクラスでもやることができる。 DateTimeクラスでもRangeオブジェクトを生成すると日単位でループする。

一日分の列挙

このループは回るのか? 答えは一回だけ回る

require 'date'
start_date = Date.new(2008, 1, 1);
end_date = Date.new(2008, 1, 1);
(start_date..end_date).each do |a_day|
  puts a_day.to_s
end

既知のフォーマットの日付っぽい文字列からDateオブジェクトを生成する

d = Date.strptime("20080424", "%Y%m%d")
d.to_s #=> 2008-04-24

ありえない日付を設定した場合は例外発生

同様にDateTimeでも作れる

hoge = DateTime.strptime("2008-04-24 12:10:25", "%Y-%m-%d %H:%M:%S")

reference

Tag

ruby/ope/datetime_ope.txt · 最終更新: 2021-06-25 12:36 by ore