2016-04-27 4 views
-1

На моей панели администрирования я выбираю дату из ввода даты и отправляю ее на сервер, который хранит ее в поле даты 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')); 
    } 
    } 
... 

Но моя проблема заключается в том, что отображается обратный отсчет меняется в соответствии с часовым поясом клиента, когда мне нужно, чтобы он был везде во всем мире!

+0

Javascript Dates использует значение времени UTC, которое представляет миллисекунды с 1970-01-01T00: 00: 00Z. Вы можете просто сравнить значения времени, чтобы увидеть, была ли одна дата до или после другой, независимо от часового пояса хост-системы. Все, о чем вы заботитесь, это точность фактического значения, которое зависит от точности часов хоста. – RobG

+0

Да, это то, что я читаю везде, но как только я меняю свой часовой пояс компьютера, обратный отсчет исчезает! Вот почему только люди, которые близки к серверу, могут правильно видеть обратный отсчет. Я нахожусь в GMT + 2, когда я помещаю свой ПК в UTC или GMT0, значение обратного отсчета неверно и, если оно достаточно близко к концу отсчета времени, оно просто исчезает. –

+0

Я отредактировал этот файл, чтобы вы могли видеть, что я имею в настоящее время (я пробовал много других вещей раньше) –

ответ

1

Вам просто нужно создать Дату Объект даты предельной с вашего сервера, как вы помечены Javascript, это будет сделано так:

var time = new Date(); 

Затем добавьте столько время, что вам нужно, что дата объект , которое является текущим временем.

После этого, вы можете сравнить, что объекта Date (который имеет серверы часовой пояс) с клиентами Дата (с их часовой пояс)

Это можно легко сделать с Moment.js:

moment(time).fromNow(); // E.g: in 24 Hours. 

На самом деле это можно легко сделать без Moment.js, но это зависит от вас. Единственный трюк - это сравнение дат с часовыми поясами на них.

+0

Я использовал этот метод с момента, но проблема в том, что мне нужна многоязычная система. Поэтому для обратного отсчета я ищу формат hh-mm-ss. –

+0

Я отредактировал этот файл, чтобы вы могли видеть, что у меня есть (0) Проголосовало: –

0

Если вы просто обратный отсчет до определенного времени, вам не нужно даже преобразовать значение времени до даты, вы можете просто сделать:

var millisecondsLeft = timeValue - new Date(); 

и это все. Если значение отрицательное, значит, вы прошли время, представленное значением времени.

Если вы передадите значение времени UTC, на которое хотите рассчитывать, то в главной системе вы можете создать эквивалентную дату, используя new Date(timeValue).

Используя этот метод, часовой пояс хозяина используется только для представления читаемой пользователем строки для вывода, это не влияет на значение даты. Если вы используете метод toISOString, который всегда является GMT, то вы увидите точно такое же время на всех хостах, независимо от их настройки часового пояса.

Так что, если вы хотите, чтобы отсчитывать, скажем, в полдень 25 мая 2016 года для конкретной системы затем создать дату в этой системе и получить его значение времени:

var timeValue = new Date(2016, 4, 25, 12).getTime(); 

Теперь в любой другой системе вы можете сделать:

var date = new Date(timeValue); 

и вы получите дату точно тот же момент времени (при условии, TIMEVALUE это число, а не строка).

Также легко создать временное значение в любое время в любом часовом поясе, просто применяя соответствующее смещение либо к значению времени, либо к объекту даты (используя методы UTC) до получения значения времени.

+0

Я отредактировал этот файл, чтобы видеть, что у меня есть (раньше я пробовал много чего) –

Смежные вопросы