请参阅此代码:
// 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
的形式返回,因此需要以某种方式转换回用户时区。
我在这里做错了什么?
答案 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