PHP:从用户端获取时区偏移量并计算"time ago"



我正在计算发布评论后经过的时间。我找到了一个功能,它运行良好

但我只是注意到显示给用户的时间是错误的,因为他/她的时区。我做了一些研究,解决方案似乎是使用名为getTimezoneOffset的javascript函数将用户的时区偏移量传递到php页面。

问题是,我无法使用这个偏移量来创建时区,并将其用于我上面链接的函数。在另一个代码的帮助下,我目前可以收集到:

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年是怎么计算的,但这是完全错误的。

几个问题: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)评估为false),即Unix epoch-1970。

你可以像这样抵消一切:

$today=new DateTime("-$offset minutes");
$tomorrow=new DateTime("+1 day-$offset minutes");

相关内容

  • 没有找到相关文章

最新更新