我正在尝试计算自评论发布以来的时间。我为此找到了function并且运行良好
但我刚刚注意到用户显示的时间是错误的,因为他/她的时区。我做了一些研究,解决方案似乎是使用名为getTimezoneOffset
的javascript函数将用户的时区偏移传递给php页面。
问题是我无法使用此偏移来创建时区并在我上面链接的那个函数上使用它。到目前为止,我可以在another code的帮助下收集:
function humanTiming ($time,$offset)
{
$isDST = 1; // Daylight Saving 1 - on, 0 - off
$timezoneName = timezone_name_from_abbr('', intval($offset, 10) * 36, $isDST);
$date = new DateTime($time, new DateTimeZone($timezoneName));
$time = strtotime($date);
$time = time() - $time; // to get the time since that moment
$tokens = array (
31536000 => 'year',
2592000 => 'month',
604800 => 'week',
86400 => 'day',
3600 => 'hour',
60 => 'minute',
1 => 'second'
);
foreach ($tokens as $unit => $text) {
if ($time < $unit) continue;
$numberOfUnits = floor($time / $unit);
return $numberOfUnits.' '.$text.(($numberOfUnits>1)?'s':'');
}
}
让我们这样调用函数:
echo humanTiming ($row['date'],"-240");
注意:-240
是我从运行该javascript函数获得的值,所以它可能是我的时区偏移量。
第一个问题:似乎值-240
无效,-0500
之类的内容有效。
第二个问题:即使我尝试使用有效的偏移值,该函数也会返回42 years
不确定如何计算这42年,但完全错误。
答案 0 :(得分:3)
有几个问题:
Javascript函数getTimezoneOffset()
以分钟为单位返回时区偏移量,但timezone_name_from_abbr()
期望以秒为单位的偏移量。因此,在-240
的示例中,实际上是-4
小时或-14396
秒。您可以通过稍微更改数学来修复代码:
$timezoneName = timezone_name_from_abbr('', intval($offset) * 60, $isDST);
由于您已开始使用DateTime
对象,因此无法使用strtotime
来获取Unix时间戳。相反,您需要format()
:
$date = new DateTime($time, new DateTimeZone($timezoneName));
$time = $date->format('U');
这应该得到你想要的结果。你得到了42年,因为时间被设置为0(strtotime($date)
评估为假),这是Unix时代 - 1970年。
答案 1 :(得分:0)
你可以像这样抵消一切:
$today=new DateTime("-$offset minutes");
$tomorrow=new DateTime("+1 day-$offset minutes");