Potrzebuję obliczyć przesunięcie, w godzinach, danej strefy czasowej z UTC w Ruby. Ta linia kodu pracował dla mnie, a przynajmniej tak myślałem:Jak obliczyć przesunięcie, w godzinach, danej strefy czasowej z UTC w ruby?
offset_in_hours = (TZInfo::Timezone.get(self.timezone).current_period.offset.utc_offset).to_f/3600.0
Ale okazuje się, że wracał do mnie Standard offset, a nie DST offset. Tak na przykład, załóżmy
self.timezone = "America/New_York"
Jeśli biegnę powyższej linii offset_in_hours = -5, -4, nie tak jak powinien, biorąc pod uwagę, że data jest dziś 1 kwietnia 2012.
Czy ktoś może mi doradzić jak obliczyć offset_in_hs z UTC podając prawidłowy ciąg TimeZone w Ruby, który uwzględnia zarówno standardowe oszczędności czasu, jak i czasu letniego?
Dzięki!
Aktualizacja
Oto wyjście z IRB. Należy pamiętać, że Nowy Jork jest 4 godziny za UTC, a nie 5, z powodu oszczędności Dzienne:
>> require 'tzinfo'
=> false
>> timezone = "America/New_York"
=> "America/New_York"
>> offset_in_hours = TZInfo::Timezone.get(timezone).current_period.utc_offset/(60*60)
=> -5
>>
To sugeruje, że jest to błąd w tzinfo lub nie jest DST-świadomy
Aktualizacja 2
W komentarzach do joelparkerhender błąd w powyższym kodzie polega na tym, że korzystałem z utc_offset, a nie utc_total_offset.
Zatem za mojego pierwotnego pytania, prawidłowa linia kodu:
offset_in_hours = (TZInfo::Timezone.get(self.timezone).current_period.offset.utc_total_offset).to_f/3600.0
Pomóż mi zrozumieć - czy current_period jest świadomy przez dst? że czas letni jest aktywny lub nieaktywny, to dlaczego current_period.offset nie bierze tego pod uwagę? Czy to błąd? W końcu wiem o tych wszystkich metodach w Time Zone, moim celem jest przypisanie poprawnej wartości zmiennej offset_in_hours – esilver
Proszę zobaczyć moje wyjście powyżej, od uruchomienia irb - to sugeruje, że tzinfo nie jest w rzeczywistości dst-świadomy, lub że jest błąd? – esilver
Nie błąd - wystarczy podać konto dst. Dodałem informacje do odpowiedzi na temat dwóch innych metod, które pokazują, jak to zrobić. – joelparkerhenderson