Обратный отсчет Javascript с использованием абсолютного часового пояса?

У меня есть таймер обратного отсчета javascript, который работает, принимая заданную дату и время и сравнивая его с текущей датой и временем. Проблема в том, что текущее время относится к часовому поясу пользователей, поэтому оставшееся время отличается от пользователей.

Как я могу отсчитать таймер до определенного времени в конкретном часовом поясе, в моем случае GMT ​​-5 часов?

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

myDateObj.getTimezoneOffset()/60

Ответ 1

Быстрый поиск показывает: convert-the-local-time-to-another-time-zone-with-this-javascript

Вслед за статьей дословно вы получите следующий пример:

var d = new Date();

var localTime = d.getTime();

var localOffset = d.getTimezoneOffset() * 60000;

var utc = localTime + localOffset;

// obtain and add destination UTC time offset
// for example, Bombay 
// which is UTC + 5.5 hours
var offset = 5.5;   
var bombay = utc + (3600000*offset);

var nd = new Date(bombay); 
alert("Bombay time is " + nd.toLocaleString() + "<br>");

jsFiddle: http://jsfiddle.net/GEpaH/

Просто обновите требуемое смещение, и вы должны быть настроены.

Ответ 2

Вы можете использовать Date.UTC(year,month,day,hours,minutes,seconds,msec)

Он работает точно так же, как конструктор Date, но возвращает временную метку аргументов в Гринвичское время (offset = 0) вместо локального времени.

var localtime=new Date(Date.UTC(year,month,day,hours,minutes,seconds,msec)) 

возвращает местное время для указанного времени UTC.

Каждый (часы которого установлены правильно) закончит обратный отсчет вместе.

Ответ 3

Просто создайте дату с RFC 2822-timestamp с часовым поясом. Затем это время будет преобразовано в текущее местоположение пользователей (в зависимости от настроек ОС). Даже с исправлениями летнее время!

Я нахожусь в Норвегии, которая в настоящее время находится в летнее время, поэтому GMT + 2. Вот что происходит, когда я создаю объект Date с использованием GMT-0500:

var myDateObj = new Date("Fri Apr 17 2015 12:00:00 GMT-0500 (CDT)");
myDateObj.toString();

Пт 17 апреля 2015 19:00:00 GMT + 0200 (CEST)

Как получить правильную строку даты для вашего местоположения? Если это часовой пояс, в котором вы сейчас находитесь; просто myDateObj.toString() в консоли браузера dev-tools. Для другого часового пояса; сначала измените часовой пояс в своей операционной системе. (Или прочитайте RFC)

new Date().toString();

Пт Апр 17 2015 12:36:57 GMT + 0200 (CEST)

Ответ 4

Вы действительно не говорите точно, что вы пытаетесь выполнить. Объект даты javascript получает локальное время и "смещение часового пояса" (относительно GMT (UTC)). Они, конечно, "установлены" пользователем, поэтому даже в том же часовом поясе у двух пользователей вряд ли будет одинаковое "время".

Если вы пытаетесь установить время между разными пользователями, вам необходимо ссылаться на некоторые централизованные полномочия времени.

Я бы использовал вызов типа AJAX (XMLHttpRequest) на страницу, принадлежащую моему собственному серверу, который возвращает мое серверное время. Таким образом, каждый пользователь ссылается на одно и то же время.

Google XMLHttpRequest, чтобы найти примеры кода JS, который вам нужен (и часто соответствующий серверный код для простой службы, такой как это).

PS: Я бы также установил какое-то простое клиентское программное обеспечение, чтобы сохранить время на моем сервере точным, синхронизируя с атомными часами каждые 10 минут.

Ответ 5

Вы не можете получить точную дату с JavaScript, так как это клиентская сторона, и она основана на часах операционной системы пользователя. Вы можете использовать jCounter для отображения обратных отсчетов на основе часовых поясов на стороне сервера.

Но, если вы действительно хотите сделать это самостоятельно, скачайте jCounter, и вы также найдете файл dateandtime.php, который извлекает текущую серверную дату, как временную метку (она должна быть размещена на сервере btw, а не на вашем рабочем столе: P)

Проверьте, как этот script использует этот файл и извлекает реальную текущую дату для работы против него и вычисляет точные обратные отсчеты.

Приветствия

Ответ 6

Чтобы пересмотреть подход, который Брэндон предпринял для вычисления времени с сдвигом по UTC, мы можем свести код к двустрочному расширению объекта Date:

/* getOffsetDate - Returns a Date shifted by a certain offset 
 * @param offset the UTC offset to shift, in hours
 * @return new date object shifted by UTC offset
 */
Date.prototype.getOffsetDate = function( offset ) {
  utc = this.getTime() + (this.getTimezoneOffset() * 60000);
  return new Date(utc + (3600000*offset));
}

Затем вы можете рассчитать сдвинутую дату UTC-5 следующим образом:

myDate = new Date().getOffsetDate(-5); 

Следует отметить, что распространение собственных прототипов таким образом обычно считается плохой практикой, поскольку оно путает основные объекты, от которых зависят другие библиотеки. Чтобы оправдать это, вам придется утверждать, что эта функциональность должна быть нативной частью объекта Date.