2
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Yokohama.rb Monthly Meetup #63 memo

Date と DateTime と Time

newnowtoday の挙動が難しい。

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の仕様に影響を与えているとは。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
2
Help us understand the problem. What are the problem?