web-dev-qa-db-fra.com

Différents timezone_types sur l'objet DateTime

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_atdatetimetz:

DateTime Object
(
    [date] => 2013-04-18 11:54:34
    [timezone_type] => 1
    [timezone] => +02:00
)

birthdatedate:

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?

27
lilly

Les fuseaux horaires peuvent être de trois types différents dans les objets DateTime:

  • Type 1; Un décalage UTC, comme dans new DateTime("17 July 2013 -0300");
  • Type 2; Une abréviation de fuseau horaire, comme dans new DateTime("17 July 2013 GMT");
  • Type 3: identifiant de fuseau horaire, tel que dans 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.

65
vascowhite

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.

1
alwayslearning