1

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

我将此脚本用于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

4

4 回答 4

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);
                    }
                }
            });
        }
    });
于 2013-01-26T06:52:14.680 回答
0

你的逻辑可能是:

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

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

于 2013-01-26T07:22:36.250 回答
0

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

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

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

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

于 2013-01-26T14:36:18.527 回答
0

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

漫步:

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

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

于 2013-02-08T16:32:23.830 回答