我在Postgres上使用Doctrine2。在一个表格中,我有两种不同的日期类型:birthdate:date
和created_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
。
我怎样才能做到这一点?
答案 0 :(得分:62)
时区可以是DateTime对象中三种不同类型之一:
new DateTime("17 July 2013 -0300");
new DateTime("17 July 2013 GMT");
new DateTime( "17 July 2013", new DateTimeZone("Europe/London"));
只有附加了类型3时区的DateTime对象才能正确使用DST。
为了始终拥有类型3,您需要将数据库中的时区存储为this list中的可接受标识符,并在实例化时将其应用于DateTime对象。
答案 1 :(得分:1)
我知道这是一篇古老的文章,但是自从提到教义以来,我觉得有必要分享我最近在此问题上的经历。
@vascowhite是正确的,但是关于通过HTTP发送到服务器(例如保存)的Doctrine日期(至少在我的配置中)是转换的时区类型2。Doctrine可以正确处理它们并正确保存日期,但是它确实< strong>不转换时区类型。
如果要执行“保存并返回新值”类型的操作,请注意,Doctrine将使用缓存的值(带有timezone_type 2)。当您希望timezone_type 3像通常在页面重新加载期间获得的一样时,这变得很重要。我们有一个自定义的日期转换器JS类,它需要timezone_type 3,但无法将其转换。诚然,日期转换器应解决这一问题,但也应注意时区类型将是“教义”中最后加载的值。保存后清除Doctrine的缓存将强制使用timezone_type 3重新加载数据。