PHP:从用户端获取时区偏移并计算“时间前”

时间:2012-09-13 16:21:49

标签: php time timezone

我正在尝试计算自评论发布以来的时间。我为此找到了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年,但完全错误。

2 个答案:

答案 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");