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

如何用Ruby中的DateTime strTime解析非英语日期?,ruby,localization,Ruby,Localization,我试图解析从CMS导出的日期。不幸的是,设置了瑞典语言环境。月份名称缩写为三个字符,在五月和十月(“maj”对“May”,以及“okt”对“Oct”)这两个月份时会有所不同 我希望使用DateTime.strTime和正确的区域设置来解决此问题,如下所示: require 'locale' Locale.default = "sv_SE" require 'date' DateTime.strptime("10 okt 2009 04:32",'%d %b %Y %H:%M') 但是,仍然解析

我试图解析从CMS导出的日期。不幸的是,设置了瑞典语言环境。月份名称缩写为三个字符,在五月和十月(“maj”对“May”,以及“okt”对“Oct”)这两个月份时会有所不同

我希望使用DateTime.strTime和正确的区域设置来解决此问题,如下所示:

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>'
ArgumentError:日期无效
摘自lib/ruby/1.9.1/date.rb:1691:in'new_by_frags'
来自lib/ruby/1.9.1/date.rb:1716:in`strtime'
来自(irb):9
从bin/irb:16:in`'
涉及同一主题,并链接到修复此问题的复杂解决方案


有没有更优雅的解决方案?这在Ruby中被认为是一个bug吗?

老实说,因为你只有两个月的时间,所以我可能会
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”这样的。比我的两个“gsub”链更具可读性。那么l10n没有办法做到这一点吗?只是容易出错的gsub?在我看来,这种特定情况下的
gsub
。根据您的使用情况,它很可能是。这不是一个解决特定问题的平台,而是在一般级别上提供解决方案的平台。有些语言有两个以上的替换,这个问题应该在更一般的层面上解决。为标准任务编写自定义解决方案不是很有效,因为每个人都必须重做相同的任务。
>> months = { 'may' => 'May', 'okt' => 'Oct' }
=> {"okt"=>"Oct", "may"=>"May"}
>> "may okt".gsub(/may|okt/) { |match| months[match] }
=> "May Oct"