Consejos de timezone by Demian Rodriguez
Demian Rodriguez nos da unos consejos para minimizar estos problemas.
1) Establecer como timezone default “UTC” tanto en el server como en la base de datos.
Ej en Debian:
#dpkg-reconfigure tzdata #restart mysql
2) Para el caso de MySQL, las columnas de tipo DATE, DATETIME o TIME no almacenan info sobre el timezone, uno es responsable de saber en que formato esta la fecha para despues mostrarla correctamente al usuario. Para esto es recomendable guardar todas las fechas en UTC.
3) Al mostrar una fecha al usuario se debe convertir al timezone adecuado. Como?
PHP:
// mostrar
$fechaDeMysql = "2011-06-01 08:30:20";
$date = new DateTime($fechaDeMysql, new DateTimeZone("UTC"));
$date->setTimeZone(date_default_timezone_get());
$date->format(...);
// guardar
$fechaQueVieneDeNoseDonde = 'Mon, 15 Aug 2005 15:52:01 +0300'; // ya tiene timezone
$date = new DateTime($fechaQueVieneDeNoseDonde);
$date->setTimeZone(new DateTimeZone("UTC"));
// guardarla en mysql...
NodeJS:
Si aca no mostramos nada al usuario es re facil, no hay que hacer nada ![]()
El proceso usa el tz del SO. Pero tambien lo podemos forzar seteando la variable de entorno al principio del script:
process.env.TZ = 'UTC';
Como obtener una fecha de la db y mostrarla al usuario en el TZ correcto? No se, es una incógnita como sabe JS en que TZ está la fecha que saque de la db. Lo pregunté aca: https://github.com/felixge/node-mysql/pull/55
// guardar /** * metodo re copado para formatear fechas* return formatted date as yyyy-mm-dd H:i:s using UTC */ Date.prototype.formatUTC = function() { function pad(n) { return n < 10 ? '0' + n : n } var d = this; return d.getUTCFullYear()+'-' + pad(d.getUTCMonth()+1)+'-' + pad(d.getUTCDate())+' ' + pad(d.getUTCHours())+':' + pad(d.getUTCMinutes())+':' + pad(d.getUTCSeconds()); }; var fechaParaInsertar = new Date('Mon, 15 Aug 2005 15:52:01 +0300').formatUTC();


Recent Comments