在更改时区时,使用DateTime获得正确的时间输出问题

时间:2015-08-29 15:36:40

标签: php datetime timezone

请参阅此代码:

// 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-&gt; formatter-&gt; defaultTimeZone设置为UTC,我们更改为的原因是因为我们传递给它的时间戳将来自UTC中的数据库,通过执行以下操作存储在数据库中:

time() - date('Z')

以上将输出如下内容:

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

正如您所看到的,第二次输出不正确(小时数不对)。

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

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

根据评论的建议,这里有一个我用来转换不同时区之间的日期/时间的函数:

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);

列出所有支持的时区:this