DateTime对象上的timezone_types不同

问题描述 投票:26回答:2

我在Postgres上使用Doctrine2。在一个表中,我有两种不同的日期类型:birthdate:datecreated_at:datetimetz。两者都成为DateTime对象,但具有不同的timezone_type。这是列表:

created_at datetimetz:

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

我怎样才能做到这一点?

php postgresql datetime timezone
2个回答
64
投票

时区可以是DateTime对象中三种不同类型之一:

  • 类型1; UTC偏移量,例如new DateTime("17 July 2013 -0300");
  • 2型;时区缩写,例如new DateTime("17 July 2013 GMT");
  • 类型3:时区标识符,例如在new DateTime( "17 July 2013", new DateTimeZone("Europe/London"));

只有附加了类型3时区的DateTime对象才能正确使用DST。

为了始终具有类型3,您需要将时区存储在数据库中作为this list中的可接受标识符,并在实例化时将其应用于DateTime对象。


1
投票

我知道这是一个古老的帖子,但是既然提到了学说,我觉得有必要分享我最近在这个问题上所经历的事情。

@vascowhite是正确的,但是关于Doctrine(至少在我的配置中)通过HTTP发送到服务器(例如保存)的日期是转换时区类型2. Doctrine正确处理它们并正确保存日期,但它不转换时区类型。

如果您正在执行“保存并返回新值”类型操作,请注意Doctrine将使用缓存值(使用timezone_type 2)。当您期望在页面重新加载期间通常会获得timezone_type 3时,这一点变得非常重要。我们有一个自定义日期转换器JS类,它需要timezone_type 3并且无法转换它。不可否认,日期转换器应该考虑到这一点,但也应该知道时区类型将是Doctrine中最后加载的值。保存后清除Doctrine的缓存将强制使用timezone_type 3重新加载数据。

© www.soinside.com 2019 - 2024. All rights reserved.