Javascript обратный отсчет с использованием абсолютного часового пояса? - PullRequest
11 голосов
/ 10 января 2012

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

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

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

myDateObj.getTimezoneOffset () / 60

Ответы [ 6 ]

7 голосов
/ 10 января 2012

Быстрый поиск показывает: конвертировать местное время-в-другой-часовой пояс-с-этим-javascript

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

var d = new Date();

var localTime = d.getTime();

var localOffset = d.getTimezoneOffset() * 60000;

var utc = localTime + localOffset;

// obtain and add destination's 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/

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

6 голосов
/ 10 января 2012

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

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

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

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

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

1 голос
/ 17 апреля 2015

Просто создайте дату с 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)

0 голосов
/ 07 апреля 2016

Чтобы пересмотреть подход, использованный Брэндоном для вычисления времени смещения 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.

0 голосов
/ 01 октября 2012

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

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

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

Приветствия

0 голосов
/ 10 января 2012

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...