Time.parse()中的Ruby日期截止

时间:2010-09-30 16:06:05

标签: ruby datetime

Ruby的Time.parse()适用于1901年12月14日至2038年1月18日的日期(这似乎与系统有关):

# works
irb(main):038:0> Time.parse('14-12-1901')
=> Sat Dec 14 00:00:00 -0600 1901

# doesn't work
irb(main):039:0> Time.parse('13-12-1901')
ArgumentError: time out of range
    from /usr/lib/ruby/1.8/time.rb:184:in `local'
    from /usr/lib/ruby/1.8/time.rb:184:in `make_time'
    from /usr/lib/ruby/1.8/time.rb:243:in `parse'
    from (irb):39
    from /usr/lib/ruby/1.8/date/format.rb:214

我想不出它停止在那里工作的原因。为什么奇怪的截止?我如何以编程方式获得有效范围?

1 个答案:

答案 0 :(得分:4)

Ruby的Time类是time_t的包装器,它使用signed int来表示自Unix纪元开始以来的秒数。使用32位int,这会导致您遇到的1901-2038边界。这通常被称为Y2038 bug

PHP实际上也遇到了同样的错误,所以虽然这是回答Ruby问题的一个奇怪的来源,但这里有一个除了PHP手册之外:

  

时间戳的有效范围通常是从星期五,1901年12月13日20:45:54 UTC到星期二,2038年1月19日03:14:07 UTC。 (这些是与32位有符号整数的最小值和最大值相对应的日期。)此外,并非所有平台都支持负时间戳,因此您的日期范围可能不会早于Unix时期。

根据this article,Ruby 1.9.2应该解决这个问题(Rails也会解决这个问题)。

或者,您可以使用DateTime类,它可以解析您遇到问题的日期:

DateTime.parse('13-12-1901').strftime("%Y-%m-%d")
=> "1901-12-13"