Ruby Time.parse让我超出范围错误

Ton*_*ony 20 ruby time datetime ruby-on-rails

我正在使用Time.parse从字符串创建一个Time对象.

由于某些原因

Time.parse("05-14-2009 19:00")
Run Code Online (Sandbox Code Playgroud)

导致一个参数我们的范围错误,而

Time.parse("05-07-2009 19:00")
Run Code Online (Sandbox Code Playgroud)

才不是

有任何想法吗?

Miq*_*uel 26

如果您知道字符串的格式使用:

Time.strptime(date, format, now=self.now) {|year| ...}   
Run Code Online (Sandbox Code Playgroud)

http://www.ruby-doc.org/core-1.9/classes/Time.html#M000266

它将解决您的问题,并可能会更快Time.parse.

编辑:

看起来他们strptime从时间课上拿走了,但Date.strptime无论如何都要打电话.如果你在Rails上,你可以这样做:

Date.strptime("05-14-2009 19:00","%m-%d-%Y %H:%M").to_time
Run Code Online (Sandbox Code Playgroud)

如果你使用纯红宝石,那么你需要:

require 'date'
d=Date._strptime("05-14-2009 19:00","%m-%d-%Y %H:%M")

Time.utc(d[:year], d[:mon], d[:mday], d[:hour], d[:min], 
         d[:sec], d[:sec_fraction], d[:zone])
Run Code Online (Sandbox Code Playgroud)

另请参阅:Ruby on Rails中的日期和时间格式问题.

  • 您也可以使用DateTime的strptime,因为Date.strptime不接受有效的每小时时间(只是一个日期).`DateTime.strptime("05-14-2009 19:00","%m-%d-%Y%H:%M").to_time` (4认同)

Oin*_*nak 15

这是因为启发式Time#parse.

这是由于英美格式.

用破折号' - '表示mm-dd-yyyy,斜线'/'表示dd/mm/yyyy.

此行为在1.9中故意更改.完成eur,iso和jp日期标准.

  • 我知道这是一个古老的答案,但我没有看到所描述的行为.我正在使用1.9.2p136.Time#parse将输入解释为dd/mm/yyyy,无论我使用' - '还是'/'. (2认同)

Bra*_*don 12

我的猜测是它期望字符串的第二部分(14)是月份.

此链接可以帮助您解析它.