Получить часовую зону клиента (не GMT) в JS

Мне нужно определить часовой пояс клиента (например, CET, GMT, EST) в JS. Получение смещения является простым, но не содержит всей информации, необходимой для определения TZ, по крайней мере, нелегко. У меня есть ощущение, что можно использовать комбинацию смещения, независимо от того, используется ли DST и по сути, и т.д., Но я надеюсь, что кто-то еще проделает эту работу уже, особенно учитывая странные исключения при работе со временем.

Этот вопрос похож, но и вопрос, и ответ основаны на (некорректном) предположении, что каждый формат браузера DateString включает имя часового пояса - что он делает не. Это деталь реализации.

Итак, с этим я в настоящее время застрял.

Ответ 1

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

Разрешить пользователю переопределять его, если вы ошибаетесь.

Ответ 2

Вы можете очистить его от метода даты toString(). new Date.toString() приводит к чему-то вроде Wed Sep 19 2012 10:04:32 GMT-0400 (Eastern Daylight Time) в Firefox, Safari и Chrome. Необходимые данные - это заглавные буквы в круглых скобках. Все, что нужно, это очистить их.

В случае Internet Explorer результат toString() уже включает EDT.

В случае Opera ваш единственный вариант - установить для GMT-0400 или аналогичный. В методе toString() нет ничего невозможного.

var now = new Date().toString();
var TZ = now.indexOf('(') > -1 ?
now.match(/\([^\)]+\)/)[0].match(/[A-Z]/g).join('') :
now.match(/[A-Z]{3,4}/)[0];
if (TZ == "GMT" && /(GMT\W*\d{4})/.test(now)) TZ = RegExp.$1;

Примеры результатов:

  • Firefox: TZ = "EDT"

  • Safari: TZ = "EDT"

  • Chrome: TZ = "EDT"

  • IE: TZ = "EDT"

  • Opera: TZ = "GMT-0400"

Кажется, что он работает так же хорошо со всеми случайными азиатскими и европейскими часовыми поясами, которые я также пытался, возвращая WPST для Гуама (стандартное время в западной части Тихого океана), MPST для Куала-Лумпура (стандартное время Малайского полуострова) и т.д.; и мирно унизится до обозначения GMT + 0X00, где браузер не дает имя (например, Перт).

Ответ 3

Что бы я делал, это определение стандартного и дневного смещения (похоже, вы уже знали. Если нет, вы можете начать с этой ссылки http://onlineaspect.com/examples/timezone/detect_timezone.js Джошем Фрейзером). Определение часового пояса всегда может выполняться на стороне сервера, когда известны стандартные и дневные смещения. Затем можно использовать вызов Ajax, чтобы обновление страницы не требовалось. Конечный результат: теперь у вас есть часовой пояс со стороны JavaScript.

Ответ 4

Начиная с этот ответ на другой вопрос, я обнаружил, что IP API также дает вам часовой пояс - довольно удобно:

$.ajax({
    url: "http://ip-api.com/json",
    type: 'GET',
    success: function(json) {
        console.log("Timezone: " + json.timezone);
    },
    error: function(err) {
        console.log("Request failed, error= " + err);
    }
});

Ответ 5

Если вам просто нужно смещение, то это намного проще

var curdate = new Date();

var offset = curdate.getTimezoneOffset();