更改时区时使用 DateTime 获取正确的时间输出时出现问题

Having issue getting correct time output using DateTime when changing timezones

请看这段代码:

// Instantiate DateTime object with users timezone
$date = new \DateTime(null, new \DateTimeZone(Yii::$app->formatter->timeZone));     

// Get current year     
echo $date->format('l, F j Y g:i:s A');

echo "<br>\n";

/* Get year the event took place */

// Change the timezone to the timezone we will be giving it a unix timestamp in
$date->setTimezone(new \DateTimeZone(Yii::$app->formatter->defaultTimeZone));

$utc_time = time() - date('Z');
$utc_time = strtotime('- 1 Year', $utc_time);

// Update our time
$date->setTimestamp($utc_time);

// Now change the timezone back to the users timezone
$date->setTimezone(new \DateTimeZone(Yii::$app->formatter->timeZone));

// Get year the thread was started in...
echo $date->format('l, F j Y g:i:s A');

Yii::$app->formatter->defaultTimeZone 被设置为 UTC 我们改变成那个的原因是因为我们传递给它的时间戳将来自 UTC 的数据库,通过执行以下操作将其存储在数据库中:

time() - date('Z')

以上将输出如下内容:

Saturday, August 29 2015 11:28:54 PM
Friday, August 29 2014 3:28:54 PM

如您所见,第二次输出不正确(时间不正确)。

我想做的是获取当前的消息(有效),然后从我们将从数据库中检索的 unix 时间戳中获取年份;但如上所述,今年将返回为 UTC,因此需要以某种方式转换回用户时区。

我做错了什么?

正如评论所建议的那样,这里有一个我用来在不同时区之间转换 date/time 的函数:

function convert_time($cur_time, $tz_name_ini, $tz_name_res)
{
    $tz1 = new DateTimeZone($tz_name_ini); 
    $tz2 = new DateTimeZone($tz_name_res); 
    $dt1 = new DateTime("now", $tz1);
    $dt2 = new DateTime("now", $tz2);

    $offset1 = $tz1->getOffset($dt1);
    $offset2 = $tz2->getOffset($dt2);
    $diff_offset = $offset2 - $offset1;

    return date("l, F j Y g:i:s A", $cur_time + $diff_offset);
}

例如,如果我的服务器在丹佛,我希望应用程序显示马德里的时间,我会按如下方式调用该函数:

$tz_name_ini = "America/Denver";
$tz_name_res = "Europe/Madrid";
convert_time(time(), $tz_name_ini, $tz_name_res);

列出所有支持的时区:http://php.net/manual/en/timezones.php