2013-07-17 11 views
20

Uso Doctrine2 su Postgres. In una tabella ho due diversi tipi di data: birthdate:date e created_at:datetimetz. Entrambi diventano oggetti DateTime ma con diverso timezone_type. Qui ci sono annunci:Different timezone_types su oggetto 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 
) 

ho bisogno di formattare i miei oggetti nello stesso modo. Entrambi dovrebbero avere timezone_type=3.

Come posso ottenere quello?

+1

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

+0

Il codice che si propone imposta solo il fuso orario. Nelle liste sopra, i fusi orari sono gli stessi, ma sono presentati in modo diverso. – lilly

+0

Se si usa '$ mytime-> setTimezone (new DateTimezone ('Europe/Berlin'))' (o qualsiasi altra cosa) su ognuno di essi, il risultato sarà che vengono presentati allo stesso modo. – Jerry

risposta

47

Timezones può essere di tre diversi tipi di oggetti DateTime:

  • tipo 1; Scostamento UTC, ad esempio new DateTime("17 July 2013 -0300");
  • Tipo 2; Un abbreviazione fuso orario, come nel new DateTime("17 July 2013 GMT");
  • Tipo 3: Un identificatore fuso orario, come nel new DateTime("17 July 2013", new DateTimeZone("Europe/London"));

Solo DateTime oggetti con tipo 3 timezones allegati consentirà DST correttamente.

Per avere sempre il tipo 3 è necessario memorizzare il fuso orario nel proprio database come identificatori accettati da this list e applicarlo all'oggetto DateTime in istanza.

+0

Bene .. Memorizzo questo fuso orario di tipo 3 nel database. Quello che sembra essere un problema è che Doctrine2 restituisce quei tipi di fuso orario differenti (anche dopo che ho passato esplicitamente il fuso orario come \ DateTimeZone ("Europa/Londra")). Non penso di avere un facile accesso per modificare il comportamento di Doctrine2, quindi ho già deciso di utilizzare timestamp semplici con la classe consumer per eseguire la formattazione datetime. O forse ho lasciato qualcosa inosservato? Hai mai lavorato su oggetti DateTime di Doctrine2 + Postgres e l'hai fatto funzionare? – lilly

+0

Scusa, non ho mai usato Doctrine, non sono un fan degli ORM, ma ho usato il [Doctrine DBAL] (http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest /index.html) e non si imbattono mai nel tuo problema in quanto mantengo il controllo sui miei dati e su come viene manipolato. – vascowhite

+0

Avendo lo stesso problema con un ORM differente, ho scoperto che '$ new = new DateTime(); $ new-> setTimestamp ($ old-> getTimestamp()); 'fa il trucco, anche se molto brutto. Includere questo nei setter allevia il dolore. –

Problemi correlati