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


PHP DateTime Timezones - Constructor vs Setter method

当使用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

另请参阅http://3v4l.org/LrZfM

我环顾四周,除了php文档中的以下评论之外,没有找到一个充分的解释来解决这些特定的行为:datetime.settimezone和php|architect's Guide to Date and Time Programming:Dealing with Timezone-DateTimeZone一书。

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

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

除此之外,这个主题(我能找到的)并不多。

这就是我想知道的:

  • 这两种时区设置方式的进一步说明
  • 我应该何时使用DateTime::__construct设置时区
  • 我应该何时使用DateTime::setTimezone设置时区
  • 使用一个与另一个或如何将其结合使用的明确示例

这是正常行为。

如果没有在构造函数中指定时区,则使用默认时区,即使用date_default_timezone_set()设置的时区。

当你打电话给:

$dateTimeTwo->setTimezone(new DateTimeZone('America/Los_Angeles'));

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


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


您的默认时区可能是UTC或相近的时区。您告诉计算机将2014-08-01设置为UTC。然后,您要求切换到早7小时的"美国/洛杉矶"时区,因此在17:00将日期更改为2014-07-31。