使用Ruby将字符串转换为日期

时间:2014-11-22 22:09:24

标签: ruby date strptime

我的日期为字符串格式:23 Nov. 2014。当然,使用这样的表达式将此字符串转换为日期很容易:

Date.strptime(my_string, '%d %b. %Y')

但是月份是五月时有一个问题 - 没有点,例如23 May 2014。我的表情破裂了。

有人可以帮忙解决这个问题吗?如何为我的案件制作普遍表达?

3 个答案:

答案 0 :(得分:3)

my_string和日期模式中删除句点。

Date.strptime(my_string.sub('.', ''), '%d %b %Y')

假设您在my_string中最多只有一个点。如果可能有多个,请使用gsub

Date.strptime(my_string.gsub('.', ''), '%d %b %Y')

答案 1 :(得分:2)

我认为你使用的是错误的方法。 Date#parse应该使用几乎“任何东西”(请参阅​​TinMan回答和评论以澄清何时不使用解析)并提供相同的对象:

p Date.parse('23 Nov 2014') #=> #<Date: 2014-11-23 ((2456985j,0s,0n),+0s,2299161j)>
p Date.parse('23 Nov. 2014') #=> #<Date: 2014-11-23 ((2456985j,0s,0n),+0s,2299161j)> same object as with the previous line

答案 2 :(得分:0)

parse方法尝试查找匹配的日期或日期时间格式,然后解析字符串以返回用于创建新Date或DateTime的值。它支持许多不同的格式,这很方便,但扫描查找匹配的过程会减慢解析时间。

此外,一些常用的格式不一定“适合”。考虑一下这里发生了什么:

Date.parse '31/01/2001'
=> #<Date: 2001-01-31 ((2451941j,0s,0n),+0s,2299161j)>

解析'%d/%m/%Y'(日,月,年)格式的日期字符串,但在美国并不常见,因为Ruby不是以美国为中心的语言。反转前两个字段会导致:

Date.parse '01/31/2001'
ArgumentError: invalid date
  from (irb):4:in `parse'
  from (irb):4
  from /Users/greg/.rbenv/versions/2.1.5/bin/irb:11:in `<main>'
irb(main):005:0> Date.parse '31/01/2001'