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
我想不出它停止在那里工作的原因。为什么奇怪的截止?我如何以编程方式获得有效范围?
答案 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"