2014年10月21日火曜日

rubyの日付処理ではまった件

rubyの日付処理をしようとしてて、不思議な変換がかかってはまってしまった件について。

試したrubyのバージョンはこれです。
$ ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]

こういうrbファイルを作って実行してみると、こういう実行結果になります。
y = 10001
m = 2
d = 31
h = 0
mm = 0

begin
  puts Time.local(y, m, d, h, mm, 0)
  rescue
    puts 'error1'
end

begin
  puts DateTime.parse("#{y}-#{m}-#{d} #{h}:#{mm}:00")
rescue
  puts 'error2'
end

実行結果
10001-03-01 00:00:00 +0900
error2
Time.localに存在しない日を入れても、次の月の月初に変換してしまうようです。

Time.localに入れる日(d)を32にしてみると、結果が変わります。
y = 10001
m = 2
d = 32
h = 0
mm = 0

begin
  puts Time.local(y, m, d, h, mm, 0)
  rescue
    puts 'error1'
end

実行結果
error1
日として取りうる値が1-31だから、31まではエラーにならないようですね。
とりあえず日付のチェックはDateTime#parseで実装してしまいました。
Timeのソース見てないけどちゃんと見てみた方がよいかもですね。。

0 件のコメント:

コメントを投稿