PHP:从用户端获取时区偏移量并计算;“很久以前”;

PHP:从用户端获取时区偏移量并计算;“很久以前”;,php,time,timezone,Php,Time,Timezone,我试图计算自发表评论以来经过的时间。我找到了一个解决方案,效果很好 但是我注意到显示给用户的时间是错误的,因为他/她时区。我做了一些研究,解决方案似乎是使用名为getTimezoneOffset的javascript函数将用户的时区偏移量传递到php页面 问题是,我无法使用此偏移量创建时区,并在上面链接的功能上使用它。借助的帮助,我目前可以收集到: function humanTiming ($time,$offset) { $isDST = 1; // Daylight Saving

我试图计算自发表评论以来经过的时间。我找到了一个解决方案,效果很好

但是我注意到显示给用户的时间是错误的,因为他/她时区。我做了一些研究,解决方案似乎是使用名为
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':'');
    }

}
注意:
-240
是我从运行javascript函数中获得的值,因此它可能是我的时区偏移量

第一期:值
-240
似乎无效,类似于
-0500
的功能正常

第二个问题:即使我尝试使用有效的偏移值,函数也会返回
42年

不确定这42年是如何计算出来的,但它完全错了。

有几个问题: Javascript函数以分钟为单位返回时区偏移量,但预期偏移量以秒为单位。因此,在您的
-240
示例中,实际上是
-4
小时或
-14396
秒。您可以通过稍微更改数学来修复代码:

$timezoneName=时区名称来自缩写(“”,intval($offset)*60,$isDST);
由于您已经开始使用
DateTime
对象,因此无法使用
strotime
获取Unix时间戳。相反,您需要:

这应该会得到你想要的结果。由于时间设置为0(
strotime($date)
evaluated为false),这是Unix epoch-1970,因此您得到了42年。

有几个问题: Javascript函数以分钟为单位返回时区偏移量,但预期偏移量以秒为单位。因此,在您的
-240
示例中,实际上是
-4
小时或
-14396
秒。您可以通过稍微更改数学来修复代码:

$timezoneName=时区名称来自缩写(“”,intval($offset)*60,$isDST);
由于您已经开始使用
DateTime
对象,因此无法使用
strotime
获取Unix时间戳。相反,您需要:


这应该会得到你想要的结果。由于时间设置为0(
strotime($date)
evaluated为false),这是Unix epoch-1970,因此您得到了42年。您可以这样抵消一切:

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

你可以这样抵消一切:

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

我根据你的帖子修改了代码,现在这个函数没有返回任何东西。我认为time ago函数本身有问题,偏移量和时间戳问题已经修复。谢谢。从几个小时前,或者几分钟前开始,它似乎没有任何意义。不知道为什么。数学问题:Pok在做了很多测试和尝试后,问题被抵消了。它必须是一个正数。因此,将其乘以
-1
。再次感谢:)我根据你的帖子更改了代码,现在函数没有返回任何内容。我认为时间间隔函数本身有问题,偏移量和时间戳问题已经修复。谢谢。从几个小时前,或者几分钟前开始,它似乎没有任何意义。不知道为什么。数学问题:Pok在做了很多测试和尝试后,问题被抵消了。它必须是一个正数。因此,将其乘以
-1
。再次感谢:)
$today=new DateTime("-$offset minutes");
$tomorrow=new DateTime("+1 day-$offset minutes");