J'utilise Doctrine2 sur Postgres. Dans un tableau, j'ai deux types de dates différents: birthdate:date
et created_at:datetimetz
. Les deux deviennent des objets DateTime mais avec des timezone_type
. Voici les listes:
created_at
datetimetz:
DateTime Object
(
[date] => 2013-04-18 11:54:34
[timezone_type] => 1
[timezone] => +02:00
)
birthdate
date:
DateTime Object
(
[date] => 1970-01-01 00:00:00
[timezone_type] => 3
[timezone] => Europe/Berlin
)
J'ai besoin de formater mes objets de la même manière. Les deux devraient avoir timezone_type=3
.
Comment puis-je y parvenir?
Les fuseaux horaires peuvent être de trois types différents dans les objets DateTime:
new DateTime("17 July 2013 -0300");
new DateTime("17 July 2013 GMT");
new DateTime( "17 July 2013", new DateTimeZone("Europe/London"));
Seuls les objets DateTime avec des fuseaux horaires de type attachés autoriseront correctement l'heure d'été.
Afin d'avoir toujours le type 3, vous devrez stocker le fuseau horaire dans votre base de données en tant qu'identificateurs acceptés de cette liste et l'appliquer à votre objet DateTime lors de l'instanciation.
Je sais que c'est un ancien article, mais comme Doctrine a été mentionné, je ressens le besoin de partager ce que j'ai récemment vécu à propos de ce problème.
@vascowhite est correct, mais en ce qui concerne Doctrine (au moins sur ma configuration) les dates envoyées au serveur (par exemple pour enregistrer) via HTTP sont converties en type de fuseau horaire 2. Doctrine les gère correctement et enregistre la date correctement, mais il ne convertit pas le type de fuseau horaire.
Si vous effectuez une opération de type "enregistrer et renvoyer de nouvelles valeurs", notez que Doctrine utilisera la valeur mise en cache (avec timezone_type 2). Cela devient important lorsque vous attendez timezone_type 3 comme vous le feriez normalement lors d'un rechargement de page. Nous avons une classe JS de convertisseur de date personnalisé qui attend timezone_type 3 et il n'a pas pu la convertir. Certes, le convertisseur de date devrait en tenir compte, mais il faut également savoir que le type de fuseau horaire sera la dernière valeur chargée dans Doctrine. Vider le cache de Doctrine après l'enregistrement forcera les données à se recharger avec timezone_type 3.