На моей панели администрирования я выбираю дату из ввода даты и отправляю ее на сервер, который хранит ее в поле даты MongoDB. Прежде чем отправить его, я меняю дату на setHour(23,59,59,999)
, так что обратный отсчет заканчивается в полночь (независимо от часового пояса, мне все равно, пока он заканчивается в тот же момент для всех в мире).Как получить всемирную действующую временную метку
Тогда (я использую Метеор), я запрашиваю поле, которое является дата объекта, я получаю свою метку времени с .getTime()
, и каждую минуту, благодаря setInterval
, я просто вычислить время, которое осталось с новым Date()
и вывести формат hh:mm
.
Но, когда я поставил свой компьютер в другой часовой пояс, при следующем вычислении интервалов изменяется значение оставшегося времени. И это то же самое происходит с моими клиентами, которые не находятся в одном и том же часовом поясе, что означает, что вычисление времени, оставшееся до конца, не будет выполнено с абсолютными значениями.
Выбор даты:
Meteor.call("saveDate", new Date(new Date(t.find("#form_date").value).setHours(23,59,59,999)));
Сохранение его в Монго, на стороне сервера:
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 Dates использует значение времени UTC, которое представляет миллисекунды с 1970-01-01T00: 00: 00Z. Вы можете просто сравнить значения времени, чтобы увидеть, была ли одна дата до или после другой, независимо от часового пояса хост-системы. Все, о чем вы заботитесь, это точность фактического значения, которое зависит от точности часов хоста. – RobG
Да, это то, что я читаю везде, но как только я меняю свой часовой пояс компьютера, обратный отсчет исчезает! Вот почему только люди, которые близки к серверу, могут правильно видеть обратный отсчет. Я нахожусь в GMT + 2, когда я помещаю свой ПК в UTC или GMT0, значение обратного отсчета неверно и, если оно достаточно близко к концу отсчета времени, оно просто исчезает. –
Я отредактировал этот файл, чтобы вы могли видеть, что я имею в настоящее время (я пробовал много других вещей раньше) –