2013-07-17 38 views
20

我在Postgres上使用Doctrine2。在一張表中我有兩種不同的日期類型:birthdate:datecreated_at:datetimetz。兩者都成爲日期時間對象,但具有不同的timezone_type。 這裏是清單:DateTime對象上的不同timezone_types

created_atdatetimetz:

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

birthdate日期:

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

我需要格式化以同樣的方式我的對象。兩者都應該有timezone_type=3

我該如何做到這一點?

+1

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

+0

您建議的代碼只設置時區。在上面的列表中,時區是相同的,但它們呈現的方式不同。 – lilly

+0

如果你在每一個上使用'$ mytime-> setTimezone(new DateTimezone('Europe/Berlin'))'(或其他),結果將會是它們以同樣的方式呈現。 – Jerry

回答

47

時區可以是三種不同類型的日期時間對象之一:

  • 類型1; UTC偏移量,如new DateTime("17 July 2013 -0300");
  • 類型2;時區的簡稱,如在​​
  • 3:A型時區標識符,諸如在new DateTime("17 July 2013", new DateTimeZone("Europe/London"));

只有日期時間與附着將允許正確DST類型3時區的對象。

爲了始終擁有類型3,您需要將時區作爲this list的可接受標識符存儲在數據庫中,並在實例化時將其應用於DateTime對象。

+0

那麼.. 我確實在數據庫中存儲這種類型3時區。看起來有問題的是Doctrine2返回那些不同的時區類型(甚至在我明確地將時區作爲\ DateTimeZone(「Europe/London」))傳遞之後。 我不認爲我可以輕鬆訪問修改Doctrine2行爲,因此我已經決定使用消費者類的簡單時間戳來進行日期時間格式設置。 或者我可能遺漏了一些未被注意到的東西?你有沒有從Doctrine2 + Postgres開發過DateTime對象並使其工作? – lilly

+0

對不起,我從來沒有使用過Doctrine,我不是ORM的粉絲,但是我已經使用了[Doctrine DBAL](http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest /index.html),並且從未遇到過您的問題,因爲我保留了對數據的控制權以及操作方式。 – vascowhite

+0

與另一個ORM有同樣的問題,我發現,'$ new = new DateTime(); $ new-> setTimestamp($ old-> getTimestamp());'儘管非常難看,把這個包括在二傳手中可以減輕痛苦。 –