Moment.js устанавливает базовое время с сервера
Я читал документацию и не могу найти способ установить дату с сервера в отличие от клиента?
Например, что-то вроде этого
moment().set('server time')
Затем moment() вернет объект Date на основе времени сервера в отличие от времени с клиентского компьютера.
Существует ли эта функциональность, а если нет, то какие рекомендуемые методы вы используете? Прямо сейчас я опроса сервера, чтобы получить время сервера, но, как вы можете себе представить, это не очень эффективно.
ОБНОВЛЕНО ПРИМЕР И РЕЗЮМЕ КОДА
Я создаю приложение для аукциона. Поэтому время сервера имеет решающее значение. Например, если пользователь изменил свои настройки времени или их время было настроено вручную, клиент может увидеть аукцион, который уже закончился, когда на самом деле все еще осталось несколько минут. Все проверки времени, очевидно, выполняются на сервере, но для этого мне нужен клиент и сервер для синхронизации. Теперь вы можете видеть, что я опроса сервера, чтобы получить последнее время каждые несколько секунд. Однако мне нужно установить момент() для вызова базового времени из переменной, которую я передаю с сервера. Поэтому каждый раз, когда я вызываю момент(), он основывает время со времени, прошедшего сначала, а не на новую Date().
app.getTime = ->
setInterval ->
$.get app.apiUrl + 'public/time', (time) ->
app.now = moment(time).format('YYYY-MM-DDTHH:mm')
, app.fetchTimeInterval
Где-то в моем приложении я использую время сервера приложений так
collection = new Auction.DealershipBasket [], query: "?$orderby=Ends&$filter=Ends lt datetime'#{app.now}'"
Вместо этого я хотел бы вызвать следующее, и он возвращает время с сервера, которое мне нужно настроить только один раз с запросом get от url выше.
now = moment().format('YYYY-MM-DDTHH:mm')
Ответы
Ответ 1
Лучший способ сделать это - запросить сервер один раз для текущего времени, а затем вычислить смещение между временем сервера и временем клиента. Затем функция может вернуть серверное время на любом этапе, используя текущую дату клиента и применяя разницу в сервере.
Вот пример:
var serverDate;
var serverOffset;
$.get('server/date/url', function(data){
// server returns a json object with a date property.
serverDate = data.date;
serverOffset = moment(serverDate).diff(new Date());
});
function currentServerDate()
{
return moment().add('milliseconds', serverOffset);
}
Ответ 2
Так как Moment.js 2.10.7 можно изменить источник времени (см. PR, который его представил).
Вы можете использовать его для синхронизации времени, которое Moment.js видит со своим серверным временем.
function setMomentOffset(serverTime) {
var offset = new Date(serverTime).getTime() - Date.now();
moment.now = function() {
return offset + Date.now();
}
}