2011-01-27 35 views

Respuesta

87

time devuelve una marca de tiempo UNIX, que es independiente de la zona horaria. Dado que una marca de tiempo UNIX denota los segundos desde 1970 UTC se podría decir que es UTC, pero realmente no tiene ninguna zona horaria.


Para ser realmente claros, una marca de tiempo UNIX tiene el mismo valor en todo el mundo en un momento dado. En el momento de escribir esto, es 1296096875 en Tokio, Londres y Nueva York. Para convertir esto en un tiempo "legible", es necesario especificar qué zona horaria que desea mostrar en. 1296096875 en Tokio es 2011-01-27 11:54:35, en Londres es 2011-01-27 02:54:35 y en Nueva York es 2011-01-26 21:54:35.

En efecto que por lo general está tratando con (una mezcla de) estos conceptos cuando los tiempos de manipulación:

  • puntos absolutos en el tiempo, que me gusta hacer referencia a como puntos en la historia humana
  • hora local, que me gusta hacer referencia a como el tiempo de reloj pared
  • marcas de tiempo completos en cualquier formato que expresan una punto absoluto en la historia humana
  • incompleta hora del reloj local de la pared

tiempo Visualize como esto:

-------+-------------------+-------+--------+----------------+------> 
     |     |  |  |    | 
Dinosaurs died  Jesus born Y2K Mars colonised  ??? 

(no a escala)

Un punto absoluto en esta línea se puede expresar como :

  • de enero 27 de 2011 02:54:35 Europe/London

Ambos formatos expresar el mismo punto en el tiempo absoluto en diferentes notaciones.El primero es un simple contador que comenzó más o menos aquí:

      start of UNIX epoch 
            | 
-------+-------------------+------++--------+----------------+------> 
     |     |  |  |    | 
Dinosaurs died  Jesus born Y2K Mars colonised  ??? 

Este último es un contador mucho más complicado, pero igualmente válidos y expresiva que comenzó más o menos aquí:

   start of Gregorian calendar 
          | 
-------+-------------------+-------+--------+----------------+------> 
     |     |  |  |    | 
Dinosaurs died  Jesus born Y2K Mars colonised  ??? 

marcas de tiempo UNIX son simples. Son un contador que comenzó en un punto específico en el tiempo y que sigue aumentando en 1 por segundo (para la definición oficial de lo que es un segundo). Imagínense que alguien en Londres inició un cronómetro a la medianoche del 1 de enero de 1970, que todavía está en funcionamiento. Eso es más o menos lo que es una marca de tiempo UNIX. Todo el mundo usa el mismo valor de ese cronómetro.

El tiempo de reloj de pared legible por el hombre es más complicado, y es aún más complicado por el hecho de que está abreviado y se omiten partes de él en el uso diario. 02:54:35 significa casi nada en la línea de tiempo de la foto de arriba. Jan. 27 2011 02:54:35 ya es mucho más específico, pero aún podría significar una variedad de puntos diferentes en esta línea. "Cuando el reloj dio las 02:54:35 el 27 de enero 2011 en Londres, Europa" es ahora por fin un punto absoluto ambigua en esta línea, ya que sólo hay un punto en el tiempo en el que esto era cierto.

Por lo tanto, las zonas horarias son un "modificador" de "tiempos de reloj de pared" que son necesarios para expresar un único punto absoluto en el tiempo utilizando una notación de calendario/hora/minuto/segundo. Sin una zona horaria, una marca de tiempo en dicho formato es ambigua, porque el reloj marcó 02:54:35 el 27 de enero de 2011 en todos los países del mundo en diferentes momentos.

Una marca de tiempo UNIX no tiene este problema intrínsecamente.


convertir de una marca de tiempo UNIX a un tiempo de reloj de pared legible por humanos, es necesario especificar qué zona horaria desea la hora mostrada. Para convertir de una hora del reloj a una marca de tiempo UNIX, es necesario saber en qué zona horaria se supone que debe estar el reloj de pared. Debe incluir la zona horaria cada vez con cada conversión, o bien establecer la zona horaria predeterminada que se utilizará con date_default_timezone_set.

+1

¿No es lo que dices estar en conflicto consigo mismo? "el tiempo devuelve una marca de tiempo UNIX, que es independiente de la zona horaria ..." y luego "Sin embargo, se calculará según la zona horaria configurada, por lo que si la zona horaria está configurada incorrectamente, la marca de tiempo estará desactivada ..." Disonancia cognitiva. – jayarjo

+0

El formato * de una indicación de fecha y hora de UNIX es independiente de la zona horaria. Una marca de tiempo UNIX expresa un punto único y absoluto en la historia humana. Sin embargo, para llegar a esta marca de tiempo * desde "hora del reloj de pared" * (por ejemplo, "26 de enero de 2011 21:54:35"), debe tenerse en cuenta la zona horaria de este reloj de pared.Admito que esto se expresa algo confuso. – deceze

+2

Reescribí y aclaré * un poco *. :) – deceze

4

http://us3.php.net/time

"devuelve la hora actual medida en el número de segundos desde el Epoch Unix (1 enero 1 970 00:00:00 GMT)."

así que creo que la respuesta a su pregunta es sí.

+2

cómo puede responder sí o bien una o pregunta ??? – yehuda

+1

Vuelva a verificar el título. –

+0

Sí, tienes razón. Lo siento. +1 en su lugar. – yehuda

2

De the documentation

devuelve la hora actual se mide en el número de segundos desde el Epoch Unix (1 de enero 1970 00:00:00 GMT).

15

A partir de PHP 5.1.0 (cuando fueron reescritos las funciones de fecha/hora), cada llamada a una función de fecha/hora generará un E_NOTICE si la zona horaria no es válida, y/o un mensaje E_WARNING si usa la configuración del sistema o la variable de entorno TZ.

Así que con el fin de obtener una marca de hora UTC se debe comprobar lo que la zona horaria actual es y trabajar fuera de ese o sólo tiene que utilizar:

$utc_str = gmdate("M d Y H:i:s", time()); 
$utc = strtotime($utc_str); 
+0

tanto time() como strtotime (gmdate ("M d Y H: i: s", time())) devuelven el mismo resultado: - \ –

+0

* Pueden * según cómo establezca su zona horaria, pero no siempre. Véalos para una aclaración adicional: http://us3.php.net/manual/en/function.gmdate.php – Julian

Cuestiones relacionadas