2017-10-26 2 views
3

Ich habe einen Dienst, der die aktuelle Zeitinformation für verschiedene Standorte zurückgibt, die Zeitzonen unter Verwendung der 3-Buchstaben-Abkürzung Format zurückgibt. Z.B. EST, , EDT usw. Jedoch scheint ActiveSupport der EDT Variante bekannt zu sein, es scheint nicht in der Lage zu sein, es zu analysieren. Beispiel:Parsing Zeitzone Abkürzungen in DST

Der vollständige Name der Zeitzone umgewandelt wird EST oder EDT nach dem Datum

Time.new(2017, 12, 1).in_time_zone('Eastern Time (US & Canada)') 
=> Fri, 01 Dec 2017 00:00:00 EST -05:00 
Time.new(2017, 12, 1).in_time_zone('Eastern Time (US & Canada)').zone 
=> "EST" 
Time.new(2017, 10, 1).in_time_zone('Eastern Time (US & Canada)') 
=> Sun, 01 Oct 2017 00:00:00 EDT -04:00 
Time.new(2017, 10, 1).in_time_zone('Eastern Time (US & Canada)').zone 
=> "EDT" 

jedoch die inverse können die DST-Variante Abkürzung nicht identifizieren:

Time.new(2017, 12, 1).in_time_zone('EST').zone 
=> "EST" 
Time.new(2017, 12, 1).in_time_zone('EST') 
=> Fri, 01 Dec 2017 00:00:00 EST -05:00 
Time.new(2017, 10, 1).in_time_zone('EDT') 
ArgumentError: Invalid Timezone: EDT 
from /home/erich/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activesupport-4.2.10/lib/active_support/core_ext/time/zones.rb:72:in `rescue in find_zone!' 

Der vollständige Name ist gut (und wahrscheinlich vorzuziehen) für meinen Fall, da es den Status der DST basierend auf dem Datum korrekt identifiziert. Wenn ich also die lange Form ableiten kann, kann ich das für jeden Tag des Jahres verwenden. Gibt es eine Methode, mit Schienen (4) vorgesehen, die dieses Mapping wie bieten wird:

some_method('EST') 
=> "Eastern Time (US & Canada)" 
some_method('EDT') 
=> "Eastern Time (US & Canada)" 

Wenn nicht, gibt es eine andere Art, wie ich mit xDT Formen umgehen können?

+1

Es gibt einige Verwirrung hier - EST und EDT sind keine Zonen, sie sind Offsets. "Eastern Time (USA & Kanada)" ist die Zone, ich bin nicht sicher, wie ich die verfügbaren 3 Character-Offsets für eine Zone am besten erhalte, aber das ist es, wonach Sie suchen. – Anthony

+0

Es ist keine Eins-zu-Eins-Zuordnung. Zum Beispiel haben sowohl "Eastern Time (USA und Kanada)" als auch "Indiana (East)" die Abkürzung "EST"/"EDT". – Stefan

+0

@Anthony Ich könnte definitiv falsch liegen, aber ich habe noch nie einen nicht-numerischen Wert als "Offset" gesehen. Die Verwirrung ist tief in Activesupport, wenn das der Fall ist. '.zone' kehrt z.B. ''EST'' (Eastern Standard Time), wobei' gmt_offset', 'utc_offset',' formatiert_offset' zurückkehren ... nun, Offsets. ;) – erich2k8

Antwort

0

Es gibt eine TimezoneParser gem, die nützlich sein könnte?

+0

Ich bin immer etwas zögerlich, um ein Juwel mit nur einem Committer und geringer Akzeptanz im Produktionscode zu verwenden, aber ich werde es überprüfen. Danke für die Empfehlung. – erich2k8

Verwandte Themen