php - planisferio - Error al analizar la cadena de tiempo en la posición 41(i): doble especificación de zona horaria
no puedo cambiar la hora de mi celular (2)
Estoy usando el daterangepicker jquery, que a su vez usa el datapicker jQuery.
Mi sistema de Ubuntu funciona bien. El navegador está enviando una cadena analizable:
$dateStarted = new /DateTime($post[''startDate'']); // Thu Nov 15 2012 00:00:00 GMT-0700 (MST)
print_r($dateStarted);
Salidas:
DateTime Object
(
[date] => 2012-11-15 00:00:00
[timezone_type] => 1
[timezone] => -07:00
)
En nuestro sistema de prueba de Windows, el navegador está enviando una zona horaria ampliada en la cadena:
$dateStarted = new /DateTime($post[''startDate'']); // Thu Nov 15 2012 00:00:00 GMT-0700 (Mountain Standard Time)
print_r($dateStarted);
Tiros y excepción:
Exception: DateTime::__construct(): Failed to parse time string
(Thu Nov 15 2012 00:00:00 GMT-0700 (Mountain Standard Time))
at position 41 (i): Double timezone specification
He buscado en Google y no puedo encontrar ningún recurso en este error específico de PHP.
Estoy "resolviendo" este problema al eliminar el texto entre corchetes que devuelve los mismos resultados:
$dateString = strstr($dateString, " (", true); // Thu Nov 15 2012 00:00:00 GMT-0700
Esto parece bastante malo de hacer y estoy buscando sugerencias sobre cómo hacer esto correctamente.
Usar ->createfromformat() como sugirió Marc B parece ser una mejor solución.
Lo que he terminado es:
$dateStarted = /DateTime::createFromFormat(''D M d Y H:i:s e+'', $post[''startDate'']); // Thu Nov 15 2012 00:00:00 GMT-0700 (Mountain Standard Time)
print_r($dateStarted);
print_r(/DateTime::getLastErrors());
Que da salida a la fecha correcta ahora:
DateTime Object
(
[date] => 2012-11-15 00:00:00
[timezone_type] => 1
[timezone] => -07:00
)
Array
(
[warning_count] => 1
[warnings] => Array
(
[33] => Trailing data
)
[error_count] => 0
[errors] => Array
(
)
)
El +
al final del formato es la magia que hace que esto funcione.
Yo diría que esto es un error. Obtienes el mismo error, al usar esta cadena
$dateStarted = new /DateTime("Thu Nov 15 2012 00:00:00 GMT-0700 (abcdefg)");
Uno menos
$dateStarted = new /DateTime("Thu Nov 15 2012 00:00:00 GMT-0700 (abcdef)");
y se analiza "correctamente".
Parece que la cadena de zona horaria está restringida a 6 caracteres. A menos que pueda y esté dispuesto a configurar sus clientes de Windows, yo diría que eliminar la "zona horaria" es una "solución" viable.