2017-10-20 55 views
1

J'ai un système multi national qui utilise deux types de formats de date différents. L'un utilise "d-m-Y" l'autre utilise "m-d-Y". J'ai une classe locale qui est responsable de la création d'un objet DateTime basé sur une chaîne de date passée dans celui-ci.Constructeur PHP DateTime - format de chaîne de date basé sur DateTimeZone

La chaîne transmise est dynamique et peut être l'une ou l'autre version. Le problème est que même si vous spécifiez DateTimeZone dans le constructeur DateTime, vous devez toujours passer une chaîne basée sur 'm-d-y'.

Je dois être en mesure de transmettre une chaîne au constructeur DateTime en fonction de la DateTimeZone transmise avec elle. Par exemple, si mon TimeZone est défini sur Australia/Sydney , le constructeur DateTime doit accepter une chaîne du type '31/11/2017 ', mais ce n'est pas le cas. Le constructeur DateTime ne prend pas en compte le TimeZone passé avec la chaîne. Je devrais utiliser DateTime :: createFromFormat, mais cela signifie que je devrais spécifier manuellement un format pour des centaines de fuseaux horaires. Il serait beaucoup plus facile si le constructeur DateTime prendrait un format de chaîne en fonction du fuseau horaire passé dans comme ça ...

$dateTime = new DateTime('31/11/2017', new DateTimeZone('Australia/Sydney'))

Cela devrait fonctionner, mais ne fonctionne pas dans mon cas. Est-ce que quelqu'un sait ce que je fais mal? Il doit y avoir un moyen d'y parvenir.

+1

Utilisez le format d'horodatage à la place – OPV

Répondre

2

Le format de votre date n'est peut-être pas accepté par le constructeur DateTime de PHP. Pour contourner ce problème, essayez ceci:

$dateTime = DateTime::createFromFormat('d/m/Y', '31/11/2017') 
    ->setTimeZone('Australia/Sydney'); 

ou

$dateTime = DateTime::createFromFormat('d/m/Y', '31/11/2017', 'Australia/Sydney'); 
+0

Lorsque j'essaie cela, ma variable $ dateTime est définie sur false. J'ai essayé aussi ceci mais il revient aussi faux ... DateTime :: createFromFormat ('31/11/2017 ',' JJ/MM/AAAA '); –

+0

Quelle est votre version de PHP? –

+0

Nous utilisons PHP 5.6 –

1

vous pouvez utiliser le php-intl extension pour obtenir des chaînes par défaut par l'environnement local chaîne

foreach (["en_US", "en_IE", "de_DE"] as $fmt) { 
    $formatter = datefmt_create($fmt, IntlDateFormatter::SHORT, IntlDateFormatter::NONE); 
    echo datefmt_get_pattern($formatter) . "\n"; 
} 

voir la documentation sur datefmt_get_pattern pour plus de détails.

+0

Les modèles "complets" renvoyés par 'datefmt_get_pattern()' doivent encore être convertis en codes de format PHP (par exemple 'yyyy'' Y'), mais une bonne approche –