Mam problem z konwersją czasu UTC Time
lub TimeWithZone
czasu lokalnego w Rails 3.
Powiedzmy, że moment
to jakaś Time
zmienna w UTC (np moment = Time.now.utc
.). Jak przestawić się moment
na moją strefę czasową, dbając o czas letni (tj. Używając EST / EDT)?
Dokładniej, chciałbym wydrukować „Poniedziałek 14 marca, 9:00”, jeśli godzina odpowiada dzisiejszej godzinie 9:00 EDT i „Poniedziałek 7 marca, 9:00”, jeśli w ostatni poniedziałek był to 9:00 czasu wschodniego.
Mam nadzieję, że jest inny sposób?
Edycja : Najpierw pomyślałem, że „EDT” powinno być rozpoznawalną strefą czasową, ale „EDT” nie jest rzeczywistą strefą czasową, bardziej przypomina stan strefy czasowej. Na przykład nie miałoby sensu prosić Time.utc(2011,1,1).in_time_zone("EDT")
. Jest to trochę zagmatwane, ponieważ „EST” to rzeczywista strefa czasowa, używana w kilku miejscach, w których nie jest używany czas letni i obowiązuje przez cały rok (UTC-5).
źródło
(new Date()).getTimeZoneOffset()
. Ale jest to dość niekonsekwentne, więc ten facet wydaje się, że napisał swój własny: onlineaspect.com/2007/06/08/ ...config.time_zone = 'Wellington'
a następnie użyć Time.current (co jest odpowiednikiem time.now, ale użyłeś ustawionej strefy czasowej)Time#localtime
poda czas w bieżącej strefie czasowej maszyny, na której działa kod:Aktualizacja: jeśli chcesz dostosować się do określonych stref czasowych, a nie własnej, jesteś na dobrej drodze. Jednak zamiast martwić się o EST vs EDT, po prostu przejdź do ogólnej strefy czasu wschodniego - będzie wiedzieć na podstawie dnia, czy jest to EDT czy EST:
źródło
in_time_zone
metody z ich strefą czasową.Time.now.localtime
działa na normalnej sesji irb, ale kiedy próbuję go uruchomić na komputerze w strefie czasowej UTC, nie działa.Można go łatwo skonfigurować za pomocą lokalnej strefy systemu, wystarczy dodać to w pliku application.rb
Następnie szyny powinny pokazywać znaczniki czasu w Twoim czasie lokalnym lub możesz użyć czegoś takiego jak ta instrukcja, aby uzyskać czas lokalny
źródło
W rzeczywistości istnieje niezły klejnot, do
local_time
którego dzwoni basecamp, który robi to wszystko tylko po stronie klienta, jak sądzę:https://github.com/basecamp/local_time
źródło
Nie wiem dlaczego, ale w moim przypadku nie działa to w sposób sugerowany wcześniej. Ale to działa tak:
Oczywiście musisz zmienić
offset
wartość na swoją.źródło
Jeśli faktycznie robisz to tylko dlatego, że chcesz uzyskać strefę czasową użytkownika, wszystko, co musisz zrobić, to zmienić strefę czasową w sobie
config/applications.rb
.Lubię to:
Railsy domyślnie zapisują Twój czas w UTC, nawet jeśli określisz aktualną strefę czasową.
Więc to wszystko, co musisz zrobić i jesteś gotowy do pracy.
źródło