2012-10-05 22 views
10

W Railsach jestem nieco zdezorientowany w sprawie wskazówek, kiedy używać DateTime.now.utc i Time.current. Wydaje się, że istnieją różne opinie na temat tego, co jest najlepsze, szczególnie w różnych wersjach.Kiedy w Railsach należy używać `DateTime.now.utc` vs.` Time.current.utc`?

Wygląda DateTime.now.utc tworzy znacznik czasu z UTC przesunięcia zera, natomiast Time.current.utc tworzy znacznik czasu ze strefy czasowej UTC . Wydaje się to subtelnym rozróżnieniem, ale w wielu przypadkach jest to bardzo ważne (np. Obliczenia DST).

Kiedy należy użyć DateTime.now.utc i kiedy należy użyć Time.current.utc? Czy istnieje jakiś powód, aby używać DateTime.now.utc zamiast Time.current.utc?

+0

Czy możesz podać przykład tego, gdzie ma to wpływ? Biorąc pod uwagę, że UTC nie ma żadnych zmian w świetle dziennym, z pewnością ma znaczenie tylko wtedy, gdy zaczniesz korzystać z innych stref czasowych ... (Nie znam Rubiego, ale zrobiłem sporo rzeczy z datą/czasem, więc z większym zapleczem mogę ci pomóc.) –

+0

@JonSkeet: Nie wiem, czy to robi różnicę. (Właśnie dlatego pytam, którego powinienem używać!) 'DateTime.now.utc' najpierw wywołuje' DateTime.now', a następnie odwraca przesunięcie UTC, aby uzyskać czas "UTC". Zauważ, że nie tłumaczy on pomiędzy _time zones_, a raczej pomiędzy _offsets_. Czy może to być problematyczne w skrajnych przypadkach, np. Niesławny przykład z lat 1927-1928 w Szanghaju? –

+0

@JonSkeet: Jeśli nie jesteś w UTC, to 'DateTime.now' i' Time.current' zarówno wytwarzają czas lokalny w czymś innym niż UTC. Innymi słowy, wydają się różnić w swoich podejściach dotyczących tego, w jaki sposób przekształcają się w UTC - robi się to przez proste zastosowanie offsetu; drugi robi to poprzez ponowne wykonanie obliczeń strefy czasowej w nowej strefie czasowej UTC. –

Odpowiedz

30

Myślę, że powinieneś użyć .current zamiast .now.

Różnica .current i .now jest .now używać czasową serwera, natomiast .current użycie jaka Rails środowisko jest ustawiony. Jeśli nie jest ustawiony, to .current będzie taki sam jak .now.

Time.current

Zwraca Time.zone.now gdy Time.zone lub config.time_zone są ustawione, inaczej po prostu zwraca Time.now.

Datetime.current

Zwraca Time.zone.now.to_datetime gdy Time.zone lub config.time_zone są ustawione, w przeciwnym razie zwraca Time. teraz.to_datetime.

+0

jak o Date.current i Date.today są takie same? – ajahongir

+0

Jaka jest różnica między 'Time.now.in_time_zone' a' Time.current'? –

+0

@pinouchon Są takie same, obie zwracają instancję 'ActiveSupport :: TimeWithZone'. – xdazz

Powiązane problemy