为什么 Time.parse 在 Rails 4 和 5 中失败,而在 Rails 3 中对于日期和时间之间有空格的日期



在调查我将旧的 Rails 3 应用程序升级到 Rails 4 后遇到的错误时,我注意到 Time.parse 在此日期字符串包含空格时失败,但在删除空格时解析正确

:在 Rails 3.3.33.5 中:

Time.parse "12/13/2016 3:11 PM"
=> 2016-12-13 15:11:00 -0500

但在 Rails 4 和 5 中:

Time.parse "12/13/2016 3:11 PM"
ArgumentError: argument out of range
from /Users/diego/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/time.rb:302:in `local'

但是,如果我删除日期和时间之间的空格,它可以工作:

Time.parse "12/13/20163:11 PM"
=> 2016-12-13 15:11:00 -0500

前者也适用于 Rails 3。我对两个版本的 Rails 之间发生了什么感到困惑,当日期和时间之间有空格时,它们破坏了时间解析。有什么想法吗?

作为解决方案,因为我需要向后兼容,所以我正在拯救 ArgumentError 并从日期字符串中取出空格,然后重试。有没有更好的解决方案?

这两个例子都是在 Ruby 2.2.5 中完成

的。

显然,在 Rails 4 及更高版本中,该字符串被解释为dd/mm/yyyy(如果你问我,它应该如此。见鬼去吧mm/dd/yyyy)。

但是,如果您想要这样做,正确的解决方案是指定格式,而不是gsub随机空格!

Time.strptime "12/13/2016 3:11 PM", '%m/%d/%Y %H:%M %p'
=> 2016-12-13 15:11:00 -0500

关于"为什么",这是正在发生的事情:

Date._parse('12/13/2016 3:11 PM')
#=> {:hour=>15, :min=>11, :year=>2016, :mon=>13, :mday=>12}

对:

Date._parse('12/13/20163:11 PM')
#=> {:hour=>15, :min=>11, :mon=>12, :mday=>13}

没有空格,年份就不被认可,12/13变得mm/dd

如果您确定日期是mm/dd/yyyy格式,则可以使用正则表达式切换ddmm

Time.parse '12/13/2016 3:11 PM'.sub(/(d{2})/(d{2})/(d{4})/, '2/1/3')

最新更新