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?
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
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
@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