将Ruby字符串转换为日期对象

3
我有一个Mongoid字段,类型为Date。我在对这个特定字段进行文档搜索时遇到了各种问题。我以字符串形式接收日期,格式如下:10/20/2013。我认为像Date.parse("10/20/2013")"10/20/2013".to_date之类的东西就足够让我做一些像MyModel.find_by(datefield: date_result)这样的事情,但是这给我带来了大量的ArgumentError超出范围类型问题。
将"10/20/2013"转换为简单的Date对象的最简单方法是什么?

你尝试过DateTime.Parse()吗?如果你可以使用DateTime而不是Date... - Josh
DateTime.parse('10/20/2013') # => ArgumentError: invalid date - the Tin Man
3个回答

5
你会得到这个:
Date.parse("10/20/2013")
ArgumentError: invalid date

问题出在10/20。Ruby是一门国际语言,而数值1020有些模糊不清。在美国,“标准”的日期格式是“MMDDYYYY”,或者在日期解析术语中为%m%d%Y。然而,世界上大多数地区使用不同的标准,“DDMMYYYY”或%d%m%Y。Ruby使用第二种格式,以天为首位。
看一下差异,很容易看出为什么Date.parse会感到困惑并抱怨。对于一个月来说,10是一个合理的日期,但20是无意义的,所以Ruby拒绝了它。
您可以通过强制使用用于解析的模式来解决此问题:
Date.strptime('10/20/2013', '%m/%d/%Y')
# => #<Date: 2013-10-20 ((2456586j,0s,0n),+0s,2299161j)>

这是一个很好的答案。 - Josh
这是我多年前遇到的问题。谢谢。 - the Tin Man

4
你可以使用 strptime 方法:
Date.strptime('10/20/2013', '%m/%d/%Y')
=> <Date: 2013-10-20 ((2456586j,0s,0n),+0s,2299161j)>

阅读此处列出的可能格式列表。


0
Date.parse("10/20/2013")
=> ArgumentError: invalid date

Date.parse("20/10/2013")
=> Sun, 20 Oct 2013

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接