2011-09-28 9 views
6

Sto tentando di analizzare le date esportate da un CMS. Sfortunatamente con un set locale svedese. I nomi dei mesi sono abbreviati in tre caratteri che fanno la differenza quando si tratta dei mesi di maggio e ottobre ("maj" vs. "May" e, "okt" vs. "Oct").Come analizzare le date non inglesi con DateTime strptime in Ruby?

mi aspetterei di usare DateTime.strptime con la corretta localizzazione impostare per risolvere questo problema, in questo modo:

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

La data è però ancora analizzato come sarebbe con i nomi dei mesi abbreviati in inglese:

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 tocchi sullo stesso argomento e collegamenti a una soluzione complessa per il fissaggio di questo.

C'è una soluzione più elegante a questo? E 'anche considerato un bug in Ruby?

risposta

4

Per essere onesti, dal momento che hai solo due mesi che sono diverse, probabilmente sarei semplicemente gsub:

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

Se volete potete mettere che in un piccolo aiutante:

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: si noti che il gsub con un hash come secondo argomento è una cosa 1.9, in 1.8 si può fare qualcosa di simile

>> months = { 'may' => 'May', 'okt' => 'Oct' } 
=> {"okt"=>"Oct", "may"=>"May"} 
>> "may okt".gsub(/may|okt/) { |match| months[match] } 
=> "May Oct" 
+0

Sembra una soluzione ragionevole per il tempo. Avevo qualcosa del genere ma non sapevo che potevi usare'gsub' in quel modo. Più leggibile della mia catena di due "tribù" una dopo l'altra. – moonhouse

+0

quindi non c'è modo di farlo con l10n? solo gsub soggetti a errori? – nurettin

+0

Il 'gsub' per questo caso specifico non sembra particolarmente soggetto a errori. A seconda del tuo caso d'uso, potrebbe essere comunque. –

Problemi correlati