Таймер обратного отсчета Javascript в GMT/UTC
У меня есть следующий код JavaScript для таймера обратного отсчета:
var end = new Date('10/26/2016 4:00 PM');
var _second = 1000;
var _minute = _second * 60;
var _hour = _minute * 60;
var _day = _hour * 24;
var timer;
function showRemaining() {
var now = new Date();
var distance = end - now;
if (distance < 0) {
clearInterval(timer);
document.getElementById('countdown').innerHTML = 'EXPIRED!';
return;
}
var days = Math.floor(distance / _day);
var hours = Math.floor((distance % _day) / _hour);
var minutes = Math.floor((distance % _hour) / _minute);
var seconds = Math.floor((distance % _minute) / _second);
document.getElementById('countdown').innerHTML = minutes + 'mins ' + seconds + 'secs';
}
timer = setInterval(showRemaining, 1000);
Это работает, но проблема в том, что мне нужен таймер обратного отсчета для работы по времени GMT/UTC, так как все мои времена на сайте / сервере хранятся таким образом.
На данный момент таймер обратного отсчета использует местное время пользователей для now
установка. Этот скрипт будет доступен по всему миру, поэтому я не могу использовать местные часовые пояса, и он должен быть в формате GMT / UTC.
то есть на момент публикации это текущее время по Гринвичу 13:17, но если я получу доступ к сценарию в Великобритании, местное время будет 14:17, поэтому обратный отсчет истечет на 1 час.
Я знаю, что JavaScript имеет
toUTCString()
метод, но когда я пытаюсь вызвать это на
function showRemaining() {
var now = new Date().toUTCString();
...
Это приводит к такому выводу:
NaNmins NaNsecs
jsfiddle здесь => https://jsfiddle.net/pzbz35q1/1/
3 ответа
Я использовал что-то похожее на следующее:
var now = new Date();
var nowUTC = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds());
var distance = end - nowUTC;
.ToUTCString() поместит строку текущей даты / времени UTC в переменную, поэтому любые вычисления, основанные на ней, будут неудачными (так как он пытается вычислить число из строки).
Javascript Date объекты всегда в формате UTC. Это значения, передаваемые в конструктор, и значения, возвращаемые методами get *, которые могут рассматриваться как локальные.
Анализ "26.10.2016, 16:00" конструктором Date полностью зависит от реализации, и результатом может быть недопустимая дата. Если анализ выполняется правильно, он должен рассматриваться как 16 октября 2016 г. в 16:00 в часовом поясе хост-системы. Смещение хоста будет использоваться для создания значения времени UTC для этой даты и времени. Обратите внимание, что использование формата mm/dd/yyyy неоднозначно для большей части населения мира, поэтому формат строки должен быть предоставлен парсеру.
Если вы хотите, чтобы "26.10.2016, 4:00 PM" обрабатывалось как UTC, то вам следует проанализировать его следующим образом:
/* Parse string in mm/dd/yyyy hh:mm ap format as UTC.
** '10/26/2016 4:23 PM'
** @param {string} s - string in required format
** @returns {Date} - if string is invalid then an invalid Date is returned
*/
function parseAsUTC(s) {
var b = s.split(/\D/);
var hr = b[3]%12 + (/pm$/i.test(s)? 12 : 0);
var d = new Date(Date.UTC(b[2], --b[0], b[1], hr, b[4]))
return d && d.getUTCMonth() == b[0] && d.getUTCHours() == hr? d : new Date(NaN);
}
var d = parseAsUTC('10/26/2016 4:23 PM');
console.log('UTC date: ' + d.toISOString() + '\n' +
'Local equivalent: ' + d.toLocaleString());
Пожалуйста, поправьте меня, если я ошибаюсь, но я думаю, что мы можем сделать что-то вроде этого:
var end = new Date('Oct 26, 2016 04:00:00 GMT+00:00')
Или чтобы получить количество миллисекунд для таймера обратного отсчета:
var end = new Date('Oct 26, 2016 04:00:00 GMT+00:00').getTime()
Функция getTime() возвращает количество миллисекунд, прошедших с эпохи Unix.
Итак, насколько я знаю, это должно дать вам именно то, что вам нужно. Вам просто нужно преобразовать миллисекунды в секунды, минуты, часы, дни, как вы это делаете.