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?

¿Fue útil?

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

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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top