我正在建立一个通知系统,从功能开始需要时间。
我在函数(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]获取当前时间,并使用从数据库获得的通知时间来减去它。 数据库时间 - 当前时间=服务器端的时差
我该怎么做?
仅供参考,UTC格式如(乘以1000):1314952284779
答案 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)
你的逻辑可能是:
strtotime
(或任何类似的功能)Date
函数(乘以1000)重新构建日期我在这里看到的问题是第一步。你提到日期存储为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”或“是的,嗯,你希望我们修理我们的时钟以适应巴黎时间[虽然我们在阿根廷],夫人?” )