我在php.ini
中将PHP的时区设置为"欧洲/柏林",应该是+1到UTC(在冬天(。
当我使用date()
向用户(使用Apache和浏览器(输出Unix时间戳(UTC(时,时区使用正确。当我使用DateTime::format()
输出相同的时间戳时,没有应用时区,直到我用DateTime::setTimezone()
显式设置它。
请参阅以下示例代码:
<?php
$now = time();
// Verify Timezone
$tz = ini_get('date.timezone');
echo 'Timezone: ' . $tz . '<br>';
// Using date
echo 'date(): ' . date('Y-m-d H:i:s', $now) . '<br>';
// Using DateTime
$dt = new DateTime('@' . $now);
echo 'DateTime1: ' . $dt->format('Y-m-d H:i:s') . '<br>';
// Setting DateTime timezone explicitly
$dt->setTimezone(new DateTimeZone('Europe/Berlin'));
echo 'DateTime2: ' . $dt->format('Y-m-d H:i:s') . '<br>';
输出:
Timezone: Europe/Berlin
date(): 2020-12-09 15:31:32
DateTime1: 2020-12-09 14:31:32
DateTime2: 2020-12-09 15:31:32
为什么?我在文档中看不到DateTime::format()
默认忽略php.ini
中设置的时区的任何提示。
正如@El_Vanja在评论中指出的那样,DateTime
构造函数在由unix时间戳设置时忽略时区(请参阅文档(
::format()
方法考虑在对象(=UTC(中设置的内容,而不是在php.ini
中设置的。