Подтвердить что ты не робот

Определить идентификатор текущего пользовательского часового пояса с помощью функции moment.js

То, что я ищу, - это способ обнаружения идентификатора часового пояса браузера (как определено в таблицах Olson), но мне не нужен точный идентификатор, Мне просто нужен идентификатор часового пояса, который работает так же, как и пользовательский (например, "Европа/Рим" в порядке, если пользователь находится в Париже).

Мне не интересно текущее смещение, мне действительно нужен часовой пояс, чтобы я мог отправить его на сервер для выполнения вычислений для других дат (на сервере также есть таблицы Olson).

Теоретически, поскольку я уже использую Moment.js часовую библиотеку и включил таблицы Olson, мне больше ничего не нужно, но я не нахожу API для обнаружения. Я не знаю, скрыта ли она где-нибудь или кто-то уже ее написал. Одна из проблем заключается в том, что текущий плагин временной зоны, по-видимому, сохраняет свои данные конфиденциальными.

I dont ' хочет решение, основанное на интеграции еще одной копии или извлечение таблиц Olson (что мне нужно было бы поддерживать), я знаю, что есть несколько библиотек, дублирующих их, я хотите использовать те, которые у меня уже есть в Moment.js.

4b9b3361

Ответ 2

Я сделал небольшой script, чтобы сделать это обнаружение. Он начинается с регистрации идентификаторов доступных часовых поясов, затем при вызове функции matches проверяются все идентификаторы временной зоны для текущего времени и времени 4 и 8 месяцев спустя (чтобы отфильтровать временные интервалы с разными правилами дневного света) и пять лет назад.

Вот он:

<script src="moment-with-langs.min.js"></script>
<script src="moment-timezone.min.js"></script>
<script src="moment-timezone-data.js"></script>
<script>
var tzdetect = {
    names: moment.tz.names(),
    matches: function(base){
        var results = [], now = Date.now(), makekey = function(id){
            return [0, 4, 8, -5*12, 4-5*12, 8-5*12, 4-2*12, 8-2*12].map(function(months){
                var m = moment(now + months*30*24*60*60*1000);
                if (id) m.tz(id);
                return m.format("DDHHmm");
            }).join(' ');
        }, lockey = makekey(base);
        tzdetect.names.forEach(function(id){
            if (makekey(id)===lockey) results.push(id);
        });
        return results;
    }
};
</script>

Если вам нужен только один идентификатор часового пояса, просто используйте

var tzid = tzdetect.matches()[0];

Демонстрация

Репозиторий GitHub: https://github.com/Canop/tzdetect.js

Обновление: Показанный здесь код несовместим с последними версиями moment.js. Пожалуйста, обратитесь к репозиторий GitHub для поддерживаемого (свободного использования) кода.

Обновление 2017 года: Теперь в файле moment.js появился API, чтобы угадать часовой пояс. Это, вероятно, лучшее решение прямо сейчас.

Ответ 3

Если вы хотите использовать стандартный JavaScript API, вы можете использовать Intl.DateTimeFormat.resolvedOptions, где есть поддержка браузера:

Intl.DateTimeFormat().resolvedOptions().timeZone; // "America/Los_Angeles"

resolvedOptions в настоящее время (январь 2016) доступен во всех браузерах, кроме Safari на iOS и на рабочем столе: http://caniuse.com/#feat=internationalization

Однако свойство timeZone в настоящее время доступно только в Chrome.

Ответ 4

Там есть инструмент javascript, который делает именно это:

https://github.com/entraigas/jstz

Кажется, что имеет дело с неопределенностью часовых поясов.

В сочетании с часовым поясом momentJS вы можете получить часовой пояс и показать отформатированную дату:

var tzObj = jstz.determine();
var timezoneCode = tzObj.name();
console.log(moment.tz(timeZoneCode).format());