我正在尝试解析从CMS导出的日期。不幸的是,瑞典语区域设置。月份名称缩写为三个字符,这对五月和十月(“maj”与“五月”,“okt”与“十月”)有所不同。
我希望使用DateTime.strptime并设置正确的语言环境来解决此问题,如下所示:
require 'locale'
Locale.default = "sv_SE"
require 'date'
DateTime.strptime("10 okt 2009 04:32",'%d %b %Y %H:%M')
然而,日期仍然被解析,因为它将使用英文缩写的月份名称:
ArgumentError: invalid date
from lib/ruby/1.9.1/date.rb:1691:in `new_by_frags'
from lib/ruby/1.9.1/date.rb:1716:in `strptime'
from (irb):9
from bin/irb:16:in `<main>'
Question 4339399涉及同一主题并链接到解决此问题的复杂解决方案。
对此有更优雅的解决方案吗?这甚至被认为是Ruby中的错误吗?
答案 0 :(得分:3)
说实话,既然你只有两个月不同,我可能只是gsub
他们:
DateTime.strptime("10 okt 2009 04:32".gsub(/okt/,'Oct'),'%d %b %Y %H:%M')
如果你想要,你可以把它放到一个小帮手:
def swedish_to_english_date(date_string)
date_string.gsub(/may|okt/, 'may' => 'May', 'okt' => 'Oct')
end
DateTime.strptime(swedish_to_english_date("10 okt 2009 04:32"),'%d %b %Y %H:%M')
#=> #<DateTime: 110480161/45,0,2299161>
编辑:请注意,带有散列作为第二个参数的gsub
是1.9,在1.8中你可以做类似的事情
>> months = { 'may' => 'May', 'okt' => 'Oct' }
=> {"okt"=>"Oct", "may"=>"May"}
>> "may okt".gsub(/may|okt/) { |match| months[match] }
=> "May Oct"