2012-04-18 11 views

Respuesta

28

Las fechas no tienen zonas horarias, ya que no representan una hora.

Dicho esto, como para cómo se calcula el día de hoy, vamos a ver este extracto de 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"); 

Seguidamente se procede a utilizar el uso tm para crear el objeto Date. Como tm contiene la hora local del sistema usando localtime(), Date.today, por lo tanto, utiliza la hora local del sistema, no UTC.


Siempre se puede usar en cualquier Time#utcTime convertirlo en el lugar a UTC, o Time#getutc para devolver un nuevo objeto Time equivalente en UTC. A continuación, puede llamar al Time#to_date para obtener un Date. Entonces: some_time.getutc.to_date.

Si está utilizando ActiveSupport’s time zone support (incluido con rieles), tenga en cuenta que es completamente independiente de los constructores de tiempo de Ruby y no afecta a ellos (es decir, no cambia la forma en Time.now o Date.today trabajo). Vea también ActiveSupport extensions to Time.

+0

Gracias por la aclaración. Supongo que una mejor manera de hacer mi pregunta habría sido "¿en relación con qué zona horaria devuelve Date.today al día siguiente?" Supongo que si quiero "la fecha de hoy en UTC", tendré que hacer algo como 'Time.now.zone.to_date' (en Rails). –

+0

'Time.zone.now.to_date' usará cualquier zona horaria en la que esté configurada la aplicación. Vale la pena mirar 'Time.use_zone ('[zone name]')' en caso de que desee establecer la zona horaria para un bloque específico de código, en este caso a UTC. –

+5

Sí, con la gestión de zona horaria de ActiveSupport, puede hacer 'Time.zone.now.to_date' que es igual a' Time.current.to_date' que es igual a 'Date.current'. –

10

Una instancia de fecha se representa como un número astronómico de día juliano; no tiene parte fraccional de un día. Si bien un día juliano es relativo a GMT, por lo que técnicamente una instancia de fecha se debe considerar en GMT, para la mayoría de los propósitos puede ignorar eso y considerar que no tiene zona horaria. Solo le interesaría un huso horario si lo convirtió a DateTime o Time.

Las herramientas de ActiveSupport para la conversión de fechas le permiten especificar si desea la hora local o UTC.

Ej:

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

Vea el comentario que hice sobre la respuesta de @ AndrewMarshall con respecto a por qué hice la pregunta original. Básicamente, estoy tratando de averiguar si Date.today en el sistema local sería lo mismo que Date.today en un sistema en UTC. –

+1

Como dice Andrew, Date.today genera una fecha a partir de la hora local, no UTC. Para obtener la fecha correspondiente a la hora en UTC, intente Time.now.utc.to_date –

+0

Simplemente señalaría que, si bien para algunos países, ignorar la zona horaria de una fecha podría funcionar, aquí en Nueva Zelanda se obtiene la fecha incorrecta para la mayor parte del día laboral si haces eso. (Por ejemplo, 10 am local el 13 de febrero es, creo, a las 2100 UTC del día 12). – Rich

47

Usted puede conseguir lejos con

Time.now.utc.to_date

en rubí

+3

Mucho mejor que la respuesta aceptada. Me pregunto si esto se agregó desde abril de 2012. –

+2

esta es información útil, pero no responde la pregunta. Esto responde a la pregunta relacionada "¿cómo puedo obtener la fecha de la hora UTC actual?", el cartel preguntaba si Date.today estaba en UTC o no, no cómo obtener la fecha en utc. –

1

Si las aplicaciones de carriles está configurado para ejecutarse en el huso horario UTC continuación, sólo tiene que utilizar Time.zone.today , de lo contrario forzarlo usando Time.now.utc.to_date

0

Puede utilizar

Date.current 

Para obtener la fecha actual en la zona horaria configurada.