2012-04-18 11 views

Odpowiedz

28

Daty nie mają stref czasowych, ponieważ nie reprezentują czasu.

Powiedział, że jak dla jak oblicza aktualny dzień, spójrzmy na tym wyciągu z the code for Date.today:

time_t t; 
struct tm tm; 
// ... 
if (time(&t) == -1) 
    rb_sys_fail("time"); 
if (!localtime_r(&t, &tm)) 
    rb_sys_fail("localtime"); 

Następnie przechodzi do korzystania korzystanie tm do utworzenia obiektu Date. Ponieważ tm zawiera lokalny czas systemu przy użyciu localtime(), Date.today wykorzystuje zatem czas lokalny systemu, a nie UTC.


zawsze można użyć Time#utc na dowolnym Time przekształcić go w miejscu na UTC, lub Time#getutc aby powrócić nową równoważne Time obiekt w UTC. Możesz wtedy zadzwonić pod numer Time#to_date, aby uzyskać Date. A więc: some_time.getutc.to_date.

Jeśli używasz ActiveSupport’s time zone support (w zestawie z Rails), należy pamiętać, że jest to całkowicie odrębny od konstruktorów czasowych Ruby i nie wpływa na ich (to znaczy nie zmienia sposobu Time.now lub Date.today pracy). Zobacz także ActiveSupport extensions to Time.

+0

Dzięki za wyjaśnienia. Sądzę, że lepszym sposobem zadawania moich pytań byłoby "w połączeniu z jaką strefą czasową Date.today powraca następnego dnia?" Przypuszczam, że jeśli chcę "dzisiejszej daty w UTC", będę musiał zrobić coś w stylu 'Time.now.zone.to_date' (w Railsach). –

+0

'Time.zone.now.to_date' użyje dowolnej strefy czasowej, w której jest skonfigurowana aplikacja. Warto zajrzeć do 'Time.use_zone ('[nazwa strefy]'), jeśli chcesz ustawić strefę czasową dla określonego bloku kodu, w tym przypadku dla UTC. –

+5

Tak z zarządzaniem strefą czasową ActiveSupport, można zrobić "Time.zone.now.to_date", co równa się "Time.current.to_date" co równa się "Date.current". –

10

Wystąpienie Data jest reprezentowane jako Astronomiczny numer dnia juliańskiego; nie ma ułamkowej części dnia. Podczas gdy Dzień Julian jest względny względem GMT - technicznie rzecz biorąc, instancja Date powinna być uważana za GMT - w większości przypadków możesz to zignorować i traktować jako pozbawioną strefy czasowej. Pasowałbyś tylko do strefy czasowej, jeśli przekształcisz ją w DateTime lub Time.

Narzędzia ActiveSupport do konwersji na datę umożliwiają określenie czasu lokalnego lub czasu UTC.

Np

>> t = Date.today.to_time 
=> Wed Apr 18 00:00:00 -0400 2012 
>> t.zone 
=> "EDT" 
>> t = Date.today.to_time(:utc) 
=> Wed Apr 18 00:00:00 UTC 2012 
>> t.zone 
=> "UTC" 
+0

Zobacz komentarz, który napisałem na @ AndrewMarshall w odpowiedzi na pytanie, dlaczego zadałem oryginalne pytanie. Zasadniczo, próbuję dowiedzieć się, czy Date.today w systemie lokalnym będzie taki sam jak Date.today w systemie w UTC. –

+1

Jak mówi Andrew, Date.today generuje datę z czasu lokalnego, a nie UTC. Aby uzyskać datę odpowiadającą czasowi w UTC, spróbuj Time.now.utc.to_date –

+0

Chciałbym tylko zwrócić uwagę, że chociaż w niektórych krajach ignorowanie strefy czasowej daty może zadziałać, tutaj w NZ otrzymasz niewłaściwą datę większość dnia pracy, jeśli to zrobisz. (np. 10 rano na miejscu 13 lutego jest, jak sądzę, 2100 UTC na 12). – Rich

47

można uciec za pomocą

Time.now.utc.to_date

w Ruby

+3

Znacznie lepiej niż zaakceptowana odpowiedź. Zastanawiam się, czy to zostało dodane od kwietnia 2012 roku. –

+2

to przydatne informacje, ale nie odpowiada na pytanie. odpowiada to na pytanie "jak mogę uzyskać datę bieżącego czasu UTC?", plakat zapytał, czy Date.today był w UTC czy nie, nie jak uzyskać datę w utc. –

1

Jeśli aplikacje Rails jest skonfigurowany do pracy w strefie czasowej UTC następnie wystarczy użyć Time.zone.today , w przeciwnym razie wymuś go, używając: Time.now.utc.to_date

0

Można użyć

Date.current 

Aby uzyskać aktualną datę w skonfigurowanej strefy czasowej.