mexico - Tratando con el servidor PHP y el servidor MySQL en diferentes zonas horarias
php.ini timezone (5)
A partir de PHP 5.1.0, puede usar la función date_default_timezone_set () para establecer la zona horaria predeterminada utilizada por todas las funciones de fecha / hora en un script.
Para MySql (citado de la página de soporte de zona horaria del servidor MySQL )
Antes de MySQL 4.1.3, el servidor opera solo en la zona horaria del sistema configurada al inicio. A partir de MySQL 4.1.3, el servidor mantiene varias configuraciones de zona horaria, algunas de las cuales pueden modificarse en tiempo de ejecución.
De interés para usted es la configuración por conexión de las zonas horarias, que usaría al comienzo de sus secuencias de comandos
SET timezone = ''Europe/London'';
En cuanto a la detección de la configuración de la zona horaria del cliente, puede usar un poco de JavaScript para obtener y guardar esa información en una cookie, y usarla en lecturas de páginas posteriores, para calcular la zona horaria adecuada.
//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 husos horarios ellos mismos.
Para aquellos de nosotros que usamos paquetes de alojamiento compartido estándar, como GoDaddy o Network Solutions, ¿cómo manejamos las conversiones de fecha y hora cuando su servidor de alojamiento (PHP) y su servidor MySQL están en diferentes zonas horarias?
Además, ¿alguien tiene alguna recomendación de mejores prácticas para determinar en qué zona horaria se encuentra un visitante de su sitio y manipular adecuadamente una variable de fecha y hora?
Almacenar todo como UTC. Puede realizar conversiones en el nivel del cliente o en el lado del servidor utilizando la configuración del cliente.
En php establece la zona horaria en el archivo php.ini: ini_set("date.timezone", "America/Los_Angeles");
o, en particular, una página que puede hacer: date_default_timezone_set("America/Los_Angeles");
En mysql puedes hacer: SET GLOBAL time_zone = ''America/Los_Angeles'';
Guardo todas mis fechas como un bigint debido a haber tenido problemas con el tipo de fecha y hora antes. Guardo el resultado de la función de PHP time (), ahora cuentan como estar en la misma zona horaria :)
RE la respuesta de Željko Živković, las descripciones de zona horaria como "Europa / Londres" solo funcionan si el administrador mySQL ha agregado las tablas de zona horaria al sistema y las mantiene actualizadas.
De lo contrario, está limitado a compensaciones numéricas como ''-4: 00''. Afortunadamente, el formato de fecha php (''P'') lo proporciona (a partir de 5.1.3)
Por ejemplo, en un archivo de configuración de la aplicación que pueda 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 que PHP y mySQL acordarán qué compensación de zona horaria usar.
Utilice siempre TIMESTAMP para almacenar valores de tiempo . La columna se almacena en realidad como UNIX_TIME (época) pero se convierte implícitamente de la compensación de time_zone actual cuando se escribe, y de vuelta cuando se lee.
Si desea mostrar horas para los usuarios en otras zonas horarias, en lugar de una definición global (), establezca su zona horaria dada en el anterior. Los valores de TIMESTAMP serán convertidos automáticamente por mySQL cuando su aplicación vea el conjunto de resultados (lo que a veces puede ser un problema, si también necesita conocer la zona horaria original del evento, entonces debe estar en otra columna)
y en cuanto a "¿por qué no almacenar todas las veces como int?", eso le hace perder la capacidad de comparar y validar fechas, y significa que siempre debe convertir a la representación de fecha en el nivel de la aplicación (y es duro para los ojos cuando está viendo los datos directamente, rápido, ¿qué pasó en 1254369600?)