2008-08-20 12 views
11

Para aquellos de nosotros que utilizan Compartida Standard paquetes de alojamiento como GoDaddy o Network Solutions, ¿cómo manejar las conversiones de fecha y hora cuando su servidor de alojamiento (PHP) y el servidor MySQL están en diferentes zonas horarias?Tratar con el servidor PHP y el servidor MySQL en diferentes zonas horarias

Además, ¿Alguien tiene alguna consejos sobre mejores prácticas para determinar qué zona vez que un visitante a su sitio está en la manipulación de una variable y la fecha y hora de manera adecuada?

Respuesta

17

A partir de PHP 5.1.0 se puede utilizar date_default_timezone_set() función para establecer la zona horaria predeterminada usada por todas las funciones de fecha/hora en un script.

para MySQL (citado de la página MySQL Server Time Zone Support)

Antes de MySQL 4.1.3, el servidor opera sólo en la zona horaria del sistema establecido en el arranque. A partir de MySQL 4.1.3, el servidor mantiene varias configuraciones de zona horaria, algunos de los cuales se pueden modificar en tiempo de ejecución.

De interés para los que es configuración por conexión de las zonas horarias, que se utilizaría en el comienzo de las secuencias de comandos

SET timezone = 'Europe/London'; 

En cuanto a la detección de la configuración de cliente de zona horaria, podría utilizar un poco de JavaScript para obtener y guardar esa información para una cookie, y utilizarlo en la página posterior lee, para calcular la zona horaria correcta.

//Returns the offset (time difference) between Greenwich Mean Time (GMT) 
//and local time of Date object, in minutes. 
var offset = new Date().getTimezoneOffset(); 
document.cookie = 'timezoneOffset=' + escape(offset); 

O bien, podría ofrecerles a los usuarios la posibilidad de establecer sus zonas horarias ellos mismos.

11

tienda todo como UTC. Puede realizar conversiones en el nivel del cliente o en el lado del servidor utilizando la configuración del cliente.

php - date

mysql - utc-timestamp

+0

1 tengo la mirada de mirada furtiva pero siempre almacenar UNIX tiempo/época como firmado int (quiere firmar para las matemáticas de fecha). Nunca confunde y sobrevive el gobierno TZ cambia. – Xailor

+0

+1, mantener las cosas simples y normalizadas (= en UTC) a nivel de datos hace que sea difícil obtener la lógica incorrecta. Todas las conversiones específicas de la configuración regional se deben realizar solo a nivel de visualización. – Kos

0

que guardar todas las fechas como un bigint debido a tener problemas con el tipo tenido fechaHora antes. Guardo el resultado de la función de PHP time(), ahora cuentan como si estuvieran en la misma zona horaria :)

3

RE la respuesta de Željko Živković, las descripciones de zona horaria como 'Europe/London' solo funcionan si el administrador mySQL ha agregado las tablas de zona horaria al sistema y las mantiene actualizadas.

De lo contrario, se limitan a las compensaciones numéricos como '-4: 00'. Afortunadamente la fecha php ('P') que proporciona el formato (a partir de 5.1.3)

Así por ejemplo, en un archivo de configuración de aplicación que podría tener

define('TZ', 'US/Pacific'); 
.... 
if (defined('TZ') && function_exists('date_default_timezone_set')) { 
    date_default_timezone_set(TZ); 
    $mdb2->exec("SET SESSION time_zone = " . $mdb2->quote(date('P'))); 
} 

Esto significa PHP y MySQL de acuerdo sobre qué zona horaria desplazamiento para usar.

Utilice siempre TIMESTAMP para almacenar valores de tiempo. La columna se almacena como UNIX_TIME (época), pero implícitamente convertido de time_zone desplazamiento actual cuando se escribe, y la espalda cuando se lee.

Si desea mostrar los tiempos para los usuarios en otras zonas horarias, a continuación, en lugar de un mundial define(), defina su zona horaria dada en lo anterior.TIMESTAMP se convertirán automáticamente por MySQL en el momento de su aplicación ve el conjunto de resultados (que a veces puede ser un problema, si lo que necesita saber en realidad la zona horaria original del evento demasiado, entonces tiene que estar en otra columna)

y por lo que, "¿por qué no almacenar todo momento como int de", que hace que pierda la capacidad de comparar y validar fechas, y que significa siempre tiene que convertir a la representación actualizada a nivel de aplicación (y es difícil de los ojos cuando usted está viendo los datos directamente - rápido, lo que ocurrió en 1254369600)

0

en conjunto php zona horaria de en el archivo php.ini: ini_set("date.timezone", "America/Los_Angeles");

?

o, en particular, la página se puede hacer como: date_default_timezone_set("America/Los_Angeles");

en MySQL se puede hacer como: SET GLOBAL time_zone = 'America/Los_Angeles';

Cuestiones relacionadas