Как мне проанализировать неанглийские даты с помощью DateTime strptime в Ruby? - PullRequest
6 голосов
/ 28 сентября 2011

Я пытаюсь разобрать даты, экспортированные из CMS.К сожалению, с набором шведских локалей.Названия месяцев сокращаются до трех символов, что имеет значение, когда речь идет о месяцах, май и октябрь («май» против «май» и «окт» против «октябрь»).

Iбудет ожидать использования 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>'

Вопрос 4339399 затрагивает ту же тему и ссылается на комплексное решение для ее устранения.

Существует ли более элегантное решение для этого?Это даже считается ошибкой в ​​Ruby?

1 Ответ

3 голосов
/ 28 сентября 2011

Если честно, так как у вас всего два месяца, я бы просто 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>

Edit: Обратите внимание, что gsub с хешем в качестве второго аргумента - это 1,9, в 1,8 вы можете сделать что-то вроде

>> months = { 'may' => 'May', 'okt' => 'Oct' }
=> {"okt"=>"Oct", "may"=>"May"}
>> "may okt".gsub(/may|okt/) { |match| months[match] }
=> "May Oct"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...