【发布时间】:2016-04-27 20:46:22
【问题描述】:
在我的管理面板上,我从日期输入中选择一个日期并将其发送到服务器,服务器将其存储在 MongoDB 日期字段中。在发送之前,我将日期更改为setHour(23,59,59,999),以便倒计时在午夜结束(无论是哪个时区,只要世界上每个人在同一时刻结束,我都不会在意)。
然后(我正在使用 Meteor),我查询字段,它是一个 Date 对象,我用.getTime() 得到它的时间戳,并且由于setInterval,我每分钟计算一次剩下的时间使用新的Date(),并输出hh:mm 格式。
但是,当我将我的电脑放在不同的时区时,在下一个间隔计算时,剩余时间的值会被修改。对于不在同一时区的客户也是如此,这意味着剩余时间的计算可能不是用绝对值完成的。
选择日期:
Meteor.call("saveDate", new Date(new Date(t.find("#form_date").value).setHours(23,59,59,999)));
将其保存在服务器端的mongo中:
saveDate: date => { DailyTopic.insert({ date: date }); };
客户端计算与显示:
getTimeRemaining = function (limit) {
let endTime = new Date(limit).setHours(23, 59, 59, 999),
nowTime = Date.now();
let t = endTime - nowTime;
let seconds = Math.floor( (t/1000) % 60 ),
minutes = Math.floor( (t/1000/60) % 60 ),
hours = Math.floor( (t/(1000*60*60)) % 24 );
return ({
'hours' : hours,
'minutes' : minutes,
'seconds' : seconds
});
}
Template.debate.onCreated(function () {
let self = this;
self.timeLeft = new ReactiveVar(null);
self.limit = getTodayTopic('fetch');
self.interval = Meteor.setInterval(function () {
self.timeLeft.set( getTimeRemaining( getTodayTopic('fetch').date ) );
}, (1000 * 60));
setTimeout(function () {
self.timeLeft.set( getTimeRemaining( getTodayTopic('fetch').date ) );
}, 3000);
});
[...]
displayIimeLeft: function () {
let time = Template.instance().timeLeft.get(),
sp = " ";
if (time) {
return (time.hours + sp + TAPi18n.__('hours') + sp + time.minutes + sp + TAPi18n.__('minutes'));
}
}
...
但我的问题是,当我需要它在世界各地都相同时,显示的倒计时会根据客户端时区而变化!
【问题讨论】:
-
Javascript 日期使用 UTC 时间值,表示自 1970-01-01T00:00:00Z 以来的毫秒数。无论主机系统的时区如何,您都可以简单地比较时间值以查看一个日期是在另一个日期之前还是之后。您关心的只是实际值的准确性,这取决于主机时钟的准确性。
-
是的,这就是我到处阅读的内容,但是一旦我更改计算机时区,倒计时就会消失!这就是为什么只有靠近服务器的人才能正确看到倒计时的原因。我在 GMT+2,当我把我的电脑放在 UTC 或 GMT0 时,倒计时值是错误的,如果足够接近倒计时的结束时间,它就会消失。
-
我进行了编辑,以便您可以看到我目前拥有的东西(我之前尝试过很多其他的东西)
标签: javascript date meteor timestamp