2011-09-28 82 views
6

我想解析從CMS導出的日期。不幸的是,瑞典語區域設置。月份名稱縮寫爲三個字符,它們在五月和十月(「maj」與「May」以及「okt」與「Oct」)月份有所不同。如何使用Ruby中的DateTime strptime解析非英語日期?

我希望用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中的一個錯誤?

回答

4

說實話,因爲你只能有兩個月的時間是不同的,我可能只是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" 
+0

看起來像是一個合理的解決方案。我有這樣的東西,但不知道你可以使用'gsub'這樣的。比兩個'gsub'之後的鏈條更可讀。 – moonhouse

+0

所以沒有辦法與l10n做到這一點?只是容易出錯的gsubs? – nurettin

+0

這個特殊情況下的'gsub'對我來說並不特別容易出錯。根據你的使用情況,它可能是。 –