php timestamp utc

Tengo una consulta PHP MySQL que inserta algunos datos en una base de datos MySQL e incluye una marca de tiempo.

Actualmente, la consulta INSERT usa NOW() para la columna timestamp y se guarda en la base de datos en el siguiente formato: 2012-07-24 13:13:02

Desafortunadamente para mí, el servidor no se encuentra en mi zona horaria y figura en la lista de Estados Unidos / Los Ángeles como se muestra print date_default_timezone_get();

Esperaba hacer lo siguiente:

 date_default_timezone_set('Europe/London'); $timefordbLondonEU = date('Ymd H:i:s', time()); 

y simplemente guarde en la base de datos el $timefordbLondonEU en lugar del NOW() ;

¿Es esta una buena manera de guardar esos datos?

Muchas gracias,

Ricardo

[TEXTO AGREGADO]

Cambié el tipo en MySQL db a DateTime e hice lo siguiente:

 date_default_timezone_set('Europe/London'); $timefordbLondonEU = date('Ymd H:i:s', time()); 

Está funcionando, pero todavía no entiendo el concepto general.

 Assumptions based on your comments: 
  1. MySQL = No tiene un tipo de datos UTC simplemente usa el tipo INT.
  2. Unix_TimeStamp () guardará la hora actual o el conteo? en formato UTC como 1343247227.
  3. Como UTC es un conteo desde un punto 0 común, puede obtener cualquier zona horaria a partir de él. Suponiendo que no desea una fecha anterior al punto 0 de referencia en 1970.

Mi suposición y de lo que has dicho es que la mejor manera de hacerlo es guardar el tiempo como UTC en un INT (1343247227) y luego generar las zonas horarias que quieras desde allí. Nuevamente, suponiendo que no necesita almacenar fechas antes del punto 0 de referencia en 1970.

Igualmente, ¿por qué no almacenar como datetime YYYY-MM-DD HH: MM: SS en una zona horaria conocida y luego convertir a UTC u otras zonas horarias. Todo parece bastante desordenado = (

Como @Petah dijo en los comentarios, almacene sus horarios en UTC y encubrirlos en la aplicación según sea necesario.

Las marcas de tiempo de Unix están en UTC, así que generalmente almaceno mis tiempos en la base de datos como marcas de tiempo. Esto ahorra el dolor de cabeza y la confusión de la primera conversión a UTC para insertar, y luego de UTC al seleccionar.

Es decir, haga que su campo de tiempo sea de tipo INT , y use la función UNIX_TIMESTAMP() en MySQL cuando inserte u obtenga la marca de tiempo de PHP utilizando la función de time() .

Cuando recupera la marca de tiempo del DB, estará en UTC, pero cuando la muestre en su aplicación PHP usando date() , se mostrará en la zona horaria del servidor, o lo que establezca con date_default_timezone_set .

Por lo tanto, las siguientes dos consultas funcionarán:

 INSERT INTO `table` (id, time) VALUES(NULL, UNIX_TIMESTAMP()); // or $time = time(); $query = "INSERT INTO `table` (id, time) VALUES(NULL, $time); 

Si desea seleccionarlo de la base de datos como DATETIME , puede hacer esto:

 SELECT *, FROM_UNIXTIME(time) as dt FROM `table` WHERE 1 

La columna dt resultante tendrá el formato yyyy-MM-dd hh:mm:ss .

Puede formatear la marca de tiempo numérica en PHP usando date()

Si la versión de PHP que tienes es de 64 bits, no estás limitado al rango de 1970-2036, PHP admitirá marcas de tiempo de 64 bits, solo asegúrate de usar una columna BIGINT en MySQL en ese caso.

Espero que ayude.