menu
書いてる野郎
orebike@gmail.com
日時操作に関して
昔ながらの日時を示すクラス。
便利なメソッドが沢山搭載されているが・・・昔ながらなので・・・・1970年以前2038年以降の時刻を扱うことができない・・・実質できないがそれは実装の依存であって設計思想としては特に制限は無い
日付を管理するクラス。
日時を管理するクラス。こいつをつかっとけば間違い無いかな。
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も同様のメソッドを持っている
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
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")