2013-07-17 16 views
20

Używam Doctrine2 na PostgreSQL. W jednej tabeli mam dwa różne typy dat: birthdate:date i created_at:datetimetz. Oba stają się obiektami DateTime, ale z różnymi timezone_type. Oto ofert:Różne opcje timezone_types obiektu DateTime

created_atdatetimetz:

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

birthdatedata:

DateTime Object 
(
    [date] => 1970-01-01 00:00:00 
    [timezone_type] => 3 
    [timezone] => Europe/Berlin 
) 

muszę sformatować swoje obiekty w taki sam sposób. Oba powinny mieć timezone_type=3.

Jak mogę to osiągnąć?

+1

'date_timezone_set (DateTime $ object, DateTimeZone $ timezone)' – DevZer0

+0

Kod, który proponujesz, ustawia tylko strefę czasową. W powyższych aukcjach strefy czasowe są takie same, ale prezentowane są w różny sposób. – lilly

+0

Jeśli użyjesz '$ mytime-> setTimezone (new DateTimezone ('Europe/Berlin'))' (lub cokolwiek) na każdym z nich, wynikiem będzie, że są one prezentowane w ten sam sposób. – Jerry

Odpowiedz

47

Okna czasowe może być jednym z trzech różnych typów w obiektach DateTime:

  • typu 1; Przesunięcie UTC, takie jak w new DateTime("17 July 2013 -0300");
  • Typ 2; Skrót strefy czasowej, tak jak w new DateTime("17 July 2013 GMT");
  • Typ 3: identyfikator strefy czasowej, tak jak w new DateTime("17 July 2013", new DateTimeZone("Europe/London"));

Tylko DateTime obiektów z typ 3 stref czasowych załączonych pozwoli DST prawidłowo.

Aby zawsze mieć typ 3, należy zapisać strefę czasową w bazie danych jako akceptowane identyfikatory z this list i zastosować ją do obiektu DateTime podczas tworzenia instancji.

+0

Cóż .. Przechowuję ten strefę czasową tego typu 3 w bazie danych. To, co wydaje się być problemem, polega na tym, że Doctrine2 zwraca te różne typy stref czasowych (nawet po wyraźnym przekazaniu strefy czasowej jako \ DateTimeZone ("Europe/London")). Nie wydaje mi się, żebym miał łatwy dostęp do modyfikowania zachowania Doctrine2, dlatego już zdecydowałem się używać prostych znaczników czasu z klasą konsumencką do formatowania datetime. A może zostawiłem coś niezauważonego? Czy kiedykolwiek pracowałeś nad obiektami DateTime z Doctrine2 + Postgres i sprawiłeś, że działał? – lilly

+0

Przepraszam, nigdy nie używałem Doctrine, nie jestem fanem ORM, ale użyłem [Doctrine DBAL] (http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest /index.html) i nigdy nie napotkasz problemu, ponieważ zachowuję kontrolę nad moimi danymi i sposobem ich manipulowania. – vascowhite

+0

Mając ten sam problem z inną ORM, dowiedziałem się, że '$ new = new DateTime(); $ new-> setTimestamp ($ old-> getTimestamp()); 'robi trik, aczkolwiek bardzo brzydki. Włączenie tego w seterów zmniejsza ból. –

Powiązane problemy