Time.parse产生奇怪的日期

时间:2013-06-04 20:49:04

标签: ruby

想知道这些输入发生了什么,给了我一些奇怪而不是2013-05-31 13:30:00 -0400

Time.parse("05-31 13:30") => 2013-06-06 16:30:00 -0400

Time.parse("5 31 13:30")  => 2013-07-01 13:30:00 -0400

2 个答案:

答案 0 :(得分:2)

@ SergioTulentsev的评论指出了这个问题。 Date.parse无法了解人们可能想要构建日期/日期时间值的各种方式。这就是Date支持strptime的原因,它允许您定义模式:

require 'date'
DateTime.strptime("05-31 13:30", '%m-%d %H:%M')
=> #<DateTime: 2013-05-31T13:30:00+00:00 ((2456444j,48600s,0n),+0s,2299161j)>
DateTime.strptime("5 31 13:30", '%m %d %H:%M')
=> #<DateTime: 2013-05-31T13:30:00+00:00 ((2456444j,48600s,0n),+0s,2299161j)>

然后问题变成用于给定日期字符串的格式字符串之一。在这个测试中,我更改了第二个日期时间字符串,因此代码运行正常更明显:

require 'date'
DATE_PATTERNS = {
  /[0-2]\d-\d{2} \d{2}:\d{2}/  => '%m-%d %H:%M',
  /[0-2]?\d \d{1,2} \d{2}:\d{2}/ => '%m %d %H:%M'
}

puts ["05-31 13:30", "5 31 13:31"].map { |str|
  pattern = DATE_PATTERNS.keys.find { |k|
    str[k]
  }
  puts pattern.source
  DateTime.strptime(str[pattern], DATE_PATTERNS[pattern]).to_s
}

哪个输出:

[0-2]\d-\d{2} \d{2}:\d{2}
[0-2]?\d \d{1,2} \d{2}:\d{2}
2013-05-31T13:30:00+00:00
2013-05-31T13:31:00+00:00

答案 1 :(得分:0)

在你的时间字符串中缺少年份。 解析尝试修复此问题但失败了。

随着年份 - 如此

Time.parse("2013-05-31 13:30")

解析工作。