比较PHP服务器时间和JavaScript时间(客户端浏览器时间)

时间:2013-01-26 06:33:47

标签: php javascript jquery

我正在建立一个通知系统,从功能开始需要时间。

我在函数(jQuery)中使用此脚本:

$.fn.updateSince = function(interval) {
    var times = this.map(function(){ return { e: $(this), t: parseInt($(this).html()) }; });

    var format = function(t) {
        if(t > 86400) {
            return Math.floor(t / 86400) + ' days ago';
        } else if (t > 3600) {
            return Math.floor(t / 3600) + ' hours ago';
        } else if (t > 60) {
            return Math.floor(t / 60) + ' minute ago';
        } else if (t > 50) {
            return '50 seconds ago';
        } else if (t > 40) {
            return '40 seconds ago';
        } else if (t > 30) {
            return '30 seconds ago';
        } else if (t > 25) {
            return '25 seconds ago';
        } else if (t > 15) {
            return '15 seconds ago';
        } else if (t > 10) {
            return '10 seconds ago';
        } else {
            return 'a few seconds ago';
        }
    }
    var update = function(){
        var now = new Date().getTime();
        $.each(times, function(i, o){
            o.e.html(format(Math.round((now - o.t) / 1000)));
        });
    };

    window.setInterval(update, interval);
    update();
    return this;
}

通知存储在MySQL数据库中,每个通知都有一个时间戳,格式为:2012-12-26 06:21:28

我使用PHP strtotime并在获取每个通知项目的数据库时间时将其更改为UTC格式:(php)

 $rows['time']= strtotime($temp_time." UTC");

当我使用ajax将其传递回客户端浏览器时。我将UTC时间(来自数据库)乘以1000(javascript)

 var time = parseInt(dbtime * 1000);

然后我可以使用jQuery timesince函数将其转换为时间。

问题: 我的服务器时间因客户浏览器时间而异。 如何使它们兼容"彼此。

例如,根据客户端浏览器在2小时前发出通知。 但PHP说它是在7小时前制作的。 因为客户端浏览器时区与我的服务器

不同

我的逻辑是: 1. [PHP]获取当前时间,并使用从数据库获得的通知时间来减去它。 数据库时间 - 当前时间=服务器端的时差

  1. [PHP]然后我们得到时差。在这种情况下7小时。
  2. [PHP]如何将7小时变成UTC格式?
  3. [Javascript]将当前客户端浏览器时间也以UTC格式发送到php脚本。
  4. [PHP]客户端浏览器时间 - 7小时(UTC?)=为javascript使用而创建的实际通知时间。
  5. [PHP]将结果发回Javascript,现在时间可以在2小时前在客户端浏览器上结束。
  6. 我该怎么做?

    仅供参考,UTC格式如(乘以1000):1314952284779

4 个答案:

答案 0 :(得分:0)

我有同样的问题,我将用户的IP存储在数据库中,然后将其转换为位置,然后获取时区,然后使用此功能。这样做的主要原因是我未来你可能会考虑获取有关您的用户的信息,以便这种方法也会有所帮助。您可以使用间隔触发功能来运行代码

 j(document).ready(function () {
        window.initial = 0;
        window.setInterval(timeincrement, 60000);
        function timeincrement() {
            initial = initial + 60;
            j('.coment').each(function () {
                var timefromserver = j(this).find('input[type=hidden]').val();
                timefromserver = parseInt(timefromserver);


                if ((timefromserver / 216000) < 1) {

                    var secgone = timefromserver + initial;
                    var timeelasped = secgone / 60;

                    if (Math.floor(timeelasped) < 1) {
                        j(this).find('.lightgrey').text("Few seconds ago");
                    } else if (Math.floor(timeelasped) < 60) {
                        var innertext = timeelasped + " minutes ago";
                        j(this).find('.lightgrey').text(innertext);

                    } else if (Math.floor(timeelasped / 60) > 0) {
                        var hourgone = Math.floor(timeelasped / 60);
                        var innertext = hourgone + " hours ago";
                        j(this).find('.fdlightgrey').text(innertext);
                    }
                }
            });
        }
    });

答案 1 :(得分:0)

你的逻辑可能是:

  1. 使用strtotime(或任何类似的功能)
  2. 将通知时间转换为UNIX时间戳
  3. 使用带有此值的JavaScript Date函数(乘以1000)重新构建日期
  4. 使用(新日期) - thatDate来计算差异
  5. 转换为小时,分钟和秒
  6. 我在这里看到的问题是第一步。你提到日期存储为2012-12-26 06:21:28但是这个日期对应的时区是多少?如果它与服务器时区同时使用strtotime("2012-12-26 06:21:28")就足以生成正确的时间戳。

答案 2 :(得分:0)

对于您的信息new Date().getTime()在JavaScript返回UTC时间,只要客户端时钟是正确的,这意味着您不必处理用户的不同时区,您所要做的就是提供服务器的UTC时间。

在PHP中,您应该使用gmdate函数来创建UTC时间字符串,或者只是不格式化它,只是发送从time函数获得的原始UNIX UTC时间。

简而言之,无处不在的UTC,它的确有效。作为奖励,它的工作方式就像夏令时不存在一样。

您还可以通过在首次加载页面时发送“现在”时间戳来计算客户端上的错误时间进行调整,计算客户端上的时间,并从所有未来中减去此结果计算。但考虑到几乎所有计算机都会自动将时钟调整为时间服务器,因此计算机时钟关闭的时间超过几秒钟是非常罕见的。

答案 3 :(得分:0)

如果mysql数据是UTC,我在JavaScript中使用Date.getTimezoneOffset()并在显示历史时间时将其应用(偏移量以分钟为单位:-120 = GMT + 2)到存储在mysql中的时间(通过php获取)(当事件发生时)为用户。

RAMBLINGS:

还用于将当前时间与mysql数据进行比较(从不信任用户的时钟,但他们的时区通常是正确的[除了频繁传单的笔记本电脑,ouch]。)

我注意告诉用户她的时区区别是什么(通过发布GMT +/- XX或类似“HH:MM这应该是您当地的时间,如果不是,请修理时钟”)并要求他们如有必要,确认一下。你的代码将根据你与用户的关系来处理这种情况(“修复那个时钟,darnit”或“是的,嗯,你希望我们修理我们的时钟以适应巴黎时间[虽然我们在阿根廷],夫人?” )