【问题标题】:PHP : getting Timezone offset from user side and calculate "time ago"PHP:从用户端获取时区偏移量并计算“时间前”
【发布时间】:2012-09-06 19:12:39
【问题描述】:

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

【问题讨论】:

    标签: php time timezone


    【解决方案1】:

    几个问题: 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。

    【讨论】:

    • 我根据您的帖子更改了代码,现在该函数没有返回任何内容。
    • 我认为time ago函数本身有问题,偏移量和时间戳问题已修复。非常感谢。从几小时前或几分钟前开始,它似乎没有计算任何东西。不知道为什么。数学问题:P
    • ok 经过大量的测试和试验,问题是偏移量。它必须是一个正数。所以乘以-1。再次感谢:)
    【解决方案2】:

    你可以像这样抵消一切:

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

    【讨论】:

      猜你喜欢
      • 2018-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 2018-03-15
      • 1970-01-01
      • 2019-03-14
      相关资源
      最近更新 更多