Получить часовой пояс клиента (не смещение по Гринвичу) в JS - PullRequest
20 голосов
/ 24 мая 2010

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

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

Итак, с этим я сейчас застрял.

Ответы [ 5 ]

32 голосов
/ 19 сентября 2012

Вы можете очистить его от метода 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"

  • Опера: TZ = "GMT-0400"

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

7 голосов
/ 24 мая 2010

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

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

1 голос
/ 24 мая 2010

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

0 голосов
/ 26 мая 2016

Начиная с этого ответа на другой вопрос, я обнаружил, что 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);
    }
});
0 голосов
/ 08 февраля 2011

Если вы просто хотите смещение, тогда это намного проще

var curdate = new Date ();

var offset = curdate.getTimezoneOffset ();

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