Date と DateTime と Time
new
と now
と today
の挙動が難しい。
method | Time | Date | DateTime |
---|---|---|---|
引数なし new | 今 | -4712年 | -4712年 |
now | 今 | NoMethodError | 今 |
today | NoMethodError | 今日 | NoMethodError |
.new(2015).to_s | "2015-01-01 00:00:00 +0900" | "2015-01-01" | "2015-01-01T00:00:00+00:00" |
ぱっと見わかりにくいけど、
- Time.new(2015) は "+09:00"
- DateTime.new(2015) は "+00:00"
という辺りも難しい。
Time#to_s と DateTime#to_s の微妙な違い
Time#to_s と DateTime#to_s では微妙に書式が違う。
Time.new( 2015,1,2,3,4,5,"+09:00" ).to_s
#=> "2015-01-02 03:04:05 +0900"
DateTime.new( 2015,1,2,3,4,5,"+09:00" ).to_s
#=> "2015-01-02T03:04:05+09:00"
違いを表にしておくと。
Time | DateTime | |
---|---|---|
日付と時刻の境目 | 空白 | T |
時刻と時差の境目 | 空白 | なし |
時刻の形式 | +HHMM | +HH:MM |
Time#local の思いがけない仕様
pry で ri Time.local
とすると、
こんな
Time.local(sec, min, hour, day, month, year, dummy, dummy, isdst, dummy) #-> time
機能があることがわかる。dummy ってなんだ。
なお。 isdst
は、「is daylight saving time」で、夏時間のこと。
ちなみに、Time.utc にも
Time.utc(sec, min, hour, day, month, year, dummy, dummy, dummy, dummy) #-> time
という機能がある。直交性のためだと思う。
時差を指定する際の、バグっぽい挙動
まずは期待通りの動作について
Time.new(2015,1,2,3,4,5,"+09:00")
# => 2015-01-02 03:04:05 +0900
Time.new(2015,1,2,3,4,5,60*60*9) # 整数にすると秒数
#=> 2015-01-02 03:04:05 +0900
DateTime.new(2015,1,2,3,4,5,"+09:00").to_s
#=> "2015-01-02T03:04:05+09:00"
DateTime.new(2015,1,2,3,4,5,9r/24).to_s #DateTimeだと時差は有理数もOK
#=> "2015-01-02T03:04:05+09:00"
Time.new(2015,1,2,3,4,5,"+48:00") # 無茶な時差は例外に
#=> ArgumentError: utc_offset out of range
そしてバグっぽい挙動
DateTime.new(2015,1,2,3,4,5,"+48:00").to_s # 48は無視される。困る。
#=> "2015-01-02T03:04:05+00:00"
DateTime.new(2015,1,2,3,4,5,2r).to_s # 同じ無茶でも有理数だと通る。
#=> "2015-01-02T03:04:05+48:00"
仕様なのかどうなのか。
覚えた言葉(すぐ忘れそうだけど)
Date.new が -4712年である理由
「ユリウス通日」の起点ということらしい。
で。ユリウス通日の起点がなぜ -4712年なのかというと。
上記の Wikipedia によると
ローマ帝国での徴税額の査定更正周期
などを元に決まったらしい。こんなものがrubyの仕様に影響を与えているとは。