PHP DateTime时区 - 构造函数与Setter方法

One*_*ema 5 php timezone datetime date

当使用PHP DateTime类并尝试设置时,DateTimeZone我会根据我的设置得到不同的结果:使用DateTime::__construct或使用DateTime::setTimezone方法.

这是一个例子:

$date = '2014-08-01'

$dateTimeOne = new DateTime($date, new DateTimeZone('America/Los_Angeles'));
echo $dateTimeOne->format('Y-m-d\TH:i:sP'); 
// 2014-08-01T00:00:00-07:00

$dateTimeTwo = new DateTime($date);
$dateTimeTwo->setTimezone(new DateTimeZone('America/Los_Angeles'));
echo $dateTimeTwo->format('Y-m-d\TH:i:sP'); 
// 2014-07-31T17:00:00-07:00
Run Code Online (Sandbox Code Playgroud)

另见http://3v4l.org/LrZfM

我已经环顾四周,并没有找到解决这些特殊行为的充分解释,除了php docs中的以下注释:datetime.settimezone和书籍php |架构师的日期和时间编程指南:处理时区 - DateTimeZone.

注释指出该DateTime::setTimezone方法将更改特定时间点的时区(时间戳),但Unix时间戳保持不变.

另一方面,DateTime::__constructDateTimeZone参数用于"用用户定义的时间覆盖当前默认时区" 第3章:处理时区 - DateTimeZone.

除了这些之外,这个主题并不多(我能找到).

这就是我想知道的:

  • 进一步解释这两种设置时区的方法
  • 我什么时候应该使用它DateTime::__construct来设置时区
  • 我什么时候应该使用它DateTime::setTimezone来设置时区
  • 使用一个与另一个或如何结合使用它们的明显示例

小智 2

这是正常行为。

当您未在构造函数中指定时区时,将使用默认时区,即使用 date_default_timezone_set() 设置的时区。

当您随后致电时:

$dateTimeTwo->setTimezone(new DateTimeZone('America/Los_Angeles'));
Run Code Online (Sandbox Code Playgroud)

它将默认时区中设置的日期移至新时区。


1) (构造函数) 在 'America/Los_Angeles' 中设置日期
2) (setter) 在默认时区中设置日期,将日期移动到 'America/Los_Angeles'


您的默认时区可能是 UTC 或接近的时区。您告诉计算机将 2014 年 8 月 1 日设置为 UTC。然后,您要求切换到 7 小时前的“America/Los_Angeles”时区,因此将日期更改为 2014 年 7 月 31 日 17:00。