如何用Ruby中的DateTime strptime解析非英语日期?

moo*_*use 6 ruby localization

我正在尝试解析从CMS导出的日期.不幸的是,瑞典语区域设置.月份名称缩写为三个字符,这在5月和10月("maj"与"May","okt"与"Oct")之间有所不同.

我希望使用DateTime.strptime并设置正确的语言环境来解决此问题,如下所示:

require 'locale'
Locale.default = "sv_SE"
require 'date'
DateTime.strptime("10 okt 2009 04:32",'%d %b %Y %H:%M')
Run Code Online (Sandbox Code Playgroud)

但是仍然会解析日期,因为它将使用英文缩写的月份名称:

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>'
Run Code Online (Sandbox Code Playgroud)

问题4339399涉及同一主题,并链接到解决此问题的复杂解决方案.

有更优雅的解决方案吗?这甚至被认为是Ruby中的一个错误?

Mic*_*ohl 3

老实说,由于只有两个月的时间是不同的,我可能只是gsub想:

DateTime.strptime("10 okt 2009 04:32".gsub(/okt/,'Oct'),'%d %b %Y %H:%M')
Run Code Online (Sandbox Code Playgroud)

如果你愿意,你可以将其放入一个小助手中:

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>
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,gsub使用哈希作为第二个参数是 1.9 的事情,在 1.8 中你可以做类似的事情

>> months = { 'may' => 'May', 'okt' => 'Oct' }
=> {"okt"=>"Oct", "may"=>"May"}
>> "may okt".gsub(/may|okt/) { |match| months[match] }
=> "May Oct"
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个解决特定问题的平台,而是提供一般层面的解决方案。有些语言有超过 2 个替换,问题应该在更一般的层面上解决。为标准任务编写自定义解决方案效率不高,因为每个人都必须重做相同的任务。 (3认同)