34

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

created_at 日期时间:

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

我怎样才能做到这一点?

4

2 回答 2

82

时区可以是 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,您需要将时区作为此列表中接受的标识符存储在数据库中,并在实例化时将其应用于您的 DateTime 对象。

于 2013-07-17T21:57:57.210 回答
1

我知道这是一个古老的帖子,但是自从提到了 Doctrine,我觉得有必要分享我最近在这个问题上的经历。

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

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

于 2019-03-31T19:49:54.067 回答