Función mktime Volviendo momento equivocado?
Pregunta
Estoy teniendo un poco de problemas con la función mktime. En mi servidor de producción, si ejecuta la siguiente:
echo '<p>' . mktime(24, 0,0, 8,29,2009) . ' - 12pm</p>';
echo '<p>' . mktime(23, 0,0, 8,29,2009) . ' - 11pm</p>';
echo '<p>' . mktime(22, 0,0, 8,29,2009) . ' - 10pm</p>';
Y luego convertir esas marcas de tiempo de nuevo a formato legible (usando www.unixtimestamp.com para la conversión rápida), los tiempos son fuera una hora. Al principio pensé que era un problema con 2400 VS 0000, pero eso no explicaría las otras fechas de estar fuera.
¿Alguna idea?
Solución
El servidor tiene una zona horaria diferente a la que está esperando. marcas de tiempo Unix se miden en segundos desde el 1.1.1970 00:00:00 GMT , por lo que tiene una conversión de zona horaria oculto en el código. Puede
-
gmmktime()
para crear una marca de tiempo para una fecha GMT, - DateTime clase ,
- en php.ini o
- establecer la zona horaria para usar con la función
date_default_timezone_set()
.
Otros consejos
Me acaba de ejecutar lo siguiente desde la línea de comandos y dieron la salida siguiente (esperado). ¿Qué pasa si los ejecuta?
$ php -r "echo date('H:i:s Y-m-d', mktime(24, 0, 0, 8, 29, 2009));"
00:00:00 2009-08-30
$ php -r "echo date('H:i:s Y-m-d', mktime(23, 0, 0, 8, 29, 2009));"
23:00:00 2009-08-29
$ php -r "echo date('H:i:s Y-m-d', mktime(22, 0, 0, 8, 29, 2009));"
22:00:00 2009-08-29
Mi problema fue que en la entrada mktime
que el día y el mes con ceros a la izquierda . De la función me devolvió resultados erróneos. Una opción sería eliminar el cero con una función como
$str = ltrim($str, '0');
Fuente: ¿Cómo eliminar todos los ceros a la izquierda en una cadena
o
$var = (int)$var;
Fuente: quitar primeros ceros
He utilizado una posibilidad de soulmerge:
$date = new DateTime($year . '-' . $month . '-' . $day . ' ' . $hour . ':' . $minute . ':' . $seconds);
$match_time = $date->getTimestamp();
Sin embargo, la zona horaria debe establecerse siempre (ya sea con date_default_timezone_set()
o directamente con DateTime
.