Question Échec de l'analyse de la chaîne de temps à la position 41 (i): spécification du fuseau horaire double


J'utilise le jquery daterangepicker, qui utilise à son tour le jQuery datapicker.

Mon système Ubuntu fonctionne bien. Le navigateur envoie une chaîne analysable:

$dateStarted = new \DateTime($post['startDate']); // Thu Nov 15 2012 00:00:00 GMT-0700 (MST)
print_r($dateStarted);

Les sorties:

DateTime Object
(
    [date] => 2012-11-15 00:00:00
    [timezone_type] => 1
    [timezone] => -07:00
)

Sur notre système Windows de testeurs, le navigateur envoie un fuseau horaire étendu dans la chaîne:

$dateStarted = new \DateTime($post['startDate']); // Thu Nov 15 2012 00:00:00 GMT-0700 (Mountain Standard Time)
print_r($dateStarted);

Jette et exception:

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

J'ai cherché sur Google et je ne trouve aucune ressource sur cette erreur PHP spécifique.

Je "résolvais" ce problème en séparant le texte entre crochets qui renvoie les mêmes résultats:

$dateString = strstr($dateString, " (", true); // Thu Nov 15 2012 00:00:00 GMT-0700

Cela semble assez mal à faire et je cherche des suggestions sur la façon de le faire correctement.


16
2017-11-16 17:36


origine


Réponses:


En utilisant DateTime :: createFromFormat () comme Marc B l'a suggéré semble être une meilleure solution.

Ce que j'ai fini avec c'est:

$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());

Qui sort la date correcte maintenant:

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
        (
        )

)

le + à la fin du format se trouve la magie qui fait que cela fonctionne.


18
2017-11-16 20:55



Je dirais que c'est un bug. Vous obtenez la même erreur lorsque vous utilisez cette chaîne

$dateStarted = new \DateTime("Thu Nov 15 2012 00:00:00 GMT-0700 (abcdefg)");

Un de moins

$dateStarted = new \DateTime("Thu Nov 15 2012 00:00:00 GMT-0700 (abcdef)");

et il est analysé "correctement".

Il semble que la chaîne de fuseau horaire soit limitée à 6 caractères. À moins que vous ne puissiez et ne soyez disposé à configurer vos clients Windows, je dirais que la suppression du "fuseau horaire" est une "solution" viable.


4
2017-11-16 18:13