2014-11-22 61 views
5

我的日期字符串格式如下:23 Nov. 2014。当然,这很容易这个字符串转换成日期这样的表达:将字符串转换为带有红宝石的日期

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

但是还有一个月的时候是可以在一个问题 - 没有斑点,像23 May 2014。我的表情破裂了。

有人可以帮助解决这个问题吗?我怎样才能为我的病例做出普遍的表达?

回答

3

my_string和日期格式中删除期间。

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

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

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

而不是'sub'或'gsub',使用'tr('。','')'。它更快,并会完成同样的事情。 – 2014-11-23 05:56:43

+0

...或my_string.delete('。')'。 – 2014-12-01 04:17:59

2

我想你使用的是错误的方法。 Date#parse可与几乎“任何”工作(见铁皮人回答和澄清的时候不要使用解析评论),并提供相同的对象:

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

日期解析不能“与任何东西一起工作”,它实际上非常有限,而且速度较慢,并且由于美国与世界其他地区之间通用日期格式的差异而容易出错。相反,对你认识的日期格式使用'strptime',并且可能回退到'parse'。最好的办法是了解用户的LOCALE设置,或者让他们从选择的选项中指定并使用它。 – 2014-11-23 05:54:50

+0

美国与世界其他地区的“休息”?我觉得这是一个相当精英主义的观点。我们在这里讨论的是国际日期格式,如果某个特定国家(如美国或任何其他国家)具有表示日期的具体方式,那么您不能说因为它而解析方法“不起作用”不支持一些X国家的实施。 – daremkd 2014-11-23 13:26:48

+1

没有提到或暗示的“精英主义”。最常见的美国日期格式是不同的,太多的人对此不了解。 Ruby是一种面向国际的语言,它做得很对。我认为你的政治正在着色你如何阅读评论。 – 2014-11-24 16:15:58

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' 
+0

是的,我明白了,谢谢!我想你也推荐我从字符串中删除句点并使用'strptime'? – ktaras 2014-11-23 13:36:17

+1

您可能应该通过删除句号来标准化字符串。有办法解决这个问题,但这段时间不是三个字母的月份名称的正常部分。 – 2014-11-24 16:10:44