使用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
除了php docs: datetime.settimezone和书籍php|architect's Guide to Date and Time Programming: Dealing with Timezones - DateTimeZone中的以下评论之外,我已经环顾四周并没有找到解决这些特定行为的充分解释。
注释指出DateTime::setTimezone
方法将更改特定时间点(时间戳)的时区,但Unix时间戳保持不变。
另一方面,DateTime::__construct
DateTimeZone参数用于"用用户定义的"覆盖当前的默认时区。 Chapter 3: Dealing with Timezones - DateTimeZone。
除了这些之外,这个主题还没有多少(我能找到)。
这就是我想知道的:
DateTime::__construct
设置时区DateTime::setTimezone
设置时区答案 0 :(得分:1)
这是正常行为。
如果未在构造函数中指定时区,则使用默认时区,即使用date_default_timezone_set()设置的时区。
然后你打电话:
$dateTimeTwo->setTimezone(new DateTimeZone('America/Los_Angeles'));
它将默认时区中设置的日期移动到新时区。
1)(构造函数)在'America / Los_Angeles'中设置日期 2)(setter)在默认时区设置日期,将日期移至'America / Los_Angeles'
您的默认时区可能是UTC或接近的时间。您告诉计算机将UTC设置为2014-08-01。然后,您要求在7小时之前切换到“America / Los_Angeles”时区,方法是将日期改为2014-07-31 17:00。