【问题标题】:Compare PHP server time with JavaScript time (client browser time)比较 PHP 服务器时间和 JavaScript 时间(客户端浏览器时间)
【发布时间】:2013-01-26 06:33:47
【问题描述】:

我正在制作一个通知系统,它需要时间功能。

我将这个脚本用于timesince函数(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 小时前。

我该怎么做?

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

【问题讨论】:

  • 使用unix时间戳,没有时区
  • 但它与我的 jquery 函数不兼容
  • 为什么不把 $.fn.updateSince 移到服务器端
  • 因为脚本会按时间间隔执行该功能。在我看来,每隔几秒从服务器获取时间是不切实际的。
  • 您可以将间隔的开始时间设置为服务器端返回的时间,从而您的js可以获得增量。

标签: php javascript jquery


【解决方案1】:

你的逻辑可能是:

  1. 使用strtotime(或任何类似函数)将通知时间转换为UNIX时间戳
  2. 使用带有此值(乘以 1000)的 JavaScript Date 函数重新构建日期
  3. 使用(新日期)- thatDate 计算差异
  4. 转换为小时、分钟和秒

我在这里看到的问题是第一步。您提到日期存储为2012-12-26 06:21:28,但该日期对应于哪个时区?如果它与服务器时区相同,则使用strtotime("2012-12-26 06:21:28") 足以生成正确的时间戳。

【讨论】:

    【解决方案2】:

    我有同样的问题,我将用户的 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);
                        }
                    }
                });
            }
        });
    

    【讨论】:

    • 当然这只是一个选项。不是你可能会稍微扭曲一下以获得确切的东西
    【解决方案3】:

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

    在 PHP 中,您应该使用 gmdate 函数创建 UTC 时间字符串,或者干脆不对其进行格式化,而只发送您从 time 函数获得的原始 UNIX UTC 时间。

    简而言之,UTC 无处不在,那么它就可以工作。作为奖励,它就像不存在夏令时一样工作。

    您还可以通过在第一次加载页面时发送“现在”时间戳来调整客户端上的错误时间,计算客户端上的时间,然后从所有未来中减去此结果计算。但考虑到几乎所有计算机都会自动将其时钟调整为时间服务器的时钟,因此计算机时钟关闭超过几秒钟的情况很少见。

    【讨论】:

      【解决方案4】:

      如果 mysql 数据是 UTC,我在 JavaScript 中使用 Date.getTimezoneOffset() 并在显示历史时间时(当事件发生)对于用户。

      漫步:

      还用于将当前时间与 mysql 数据进行比较(永远不要相信用户的时钟,但他们的时区通常是正确的 [除了常旅客的笔记本电脑,哎哟])。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多