ruby - 如何在 Ruby 中使用 DateTime strptime 解析非英语日期?

标签 ruby localization

我正在尝试解析从 CMS 导出的日期。不幸的是,瑞典语言环境设置。月份名称缩写为三个字符,这在 May 和 October 月份时有所不同(“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')

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

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 中的错误吗?

最佳答案

说实话,因为你只有两个月是不同的,我可能只是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"

关于ruby - 如何在 Ruby 中使用 DateTime strptime 解析非英语日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7580238/

相关文章:

ruby - Ruby 企业版的新安装 - "gem"已识别,但 0​​x104567910 未识别

ruby-on-rails - 如何在 Ruby 中将 JSON 对象附加在一起

ruby - 由外向内呈螺旋状循环

ios - XCode 在项目/文件级别的本地化/国际化自动化,同时适用于所有字符串/数字/单位

ios - 多个目标,每个目标只有一个不同的定位

c# - 有什么理由不使用标准 resx+static 绑定(bind)来本地化 WPF 吗?

php - 在 Ruby 中使用 PesaPal API 时出现 OAuth signature_invalid 错误

ruby-on-rails - 在 Ruby 中,我应该使用 ||= 还是如果已定义?内存?

Laravel 电子邮件邮件列表即时本地化

c# - MySQL 比较查询中的日语字符作为问号