1

奇怪。这不是边缘情况。相反,假设我的服务器将它的日期/时间存储在美国/多伦多。然后我通过时间转换逻辑运行它,例如,你在西海岸。这是我得到的代码:

$timestamp = '2012-07-25 16:30:00';
$to = 'America/Toronto';
$from = 'America/Toronto';

// system timezone
$system = (new DateTimeZone($from));

// desired conversion timezone
$desired = (new DateTimeZone($to));

// timestamp DateTime object
$resource = (new DateTime($timestamp, $system));

// offset
$offset = $desired->getOffset($resource);
print($offset);

此时打印的偏移量为 -14440(4 小时)。我不认为系统或数据库时区会出现在这里(两者都设置为美国/多伦多)。任何光都将不胜感激。令人困惑:(

4

2 回答 2

3

DateTimeZone::getOffset()返回从 GMT 开始的偏移量(以秒为单位)(-14440 = 美国/多伦多的 4 小时)。

编辑:

为我最初的困惑道歉DateTime::getOffset()

无论如何,要解决您问题的标题,请使用DateTime::setTimeZone()在时区之间进行转换。

于 2012-07-24T04:27:13.480 回答
1

This is probably what you're looking for, the offset between the 2 timezones.

// system timezone
$system = (new DateTimeZone($from));

// desired conversion timezone
$desired = (new DateTimeZone($to));

// timestamp DateTime object
$resource = (new DateTime($timestamp, $system));
$desiredDateTime = (new DateTime($timestamp, $desired));

// offset
$offset = $desired->getOffset($desiredDateTime) - $system->getOffset($resource);
print($offset);
于 2012-07-24T04:31:56.390 回答