Ответ 1
теперь имеет API guess()
в качестве описанный здесь
То, что я ищу, - это способ обнаружения идентификатора часового пояса браузера (как определено в таблицах Olson), но мне не нужен точный идентификатор, Мне просто нужен идентификатор часового пояса, который работает так же, как и пользовательский (например, "Европа/Рим" в порядке, если пользователь находится в Париже).
Мне не интересно текущее смещение, мне действительно нужен часовой пояс, чтобы я мог отправить его на сервер для выполнения вычислений для других дат (на сервере также есть таблицы Olson).
Теоретически, поскольку я уже использую Moment.js часовую библиотеку и включил таблицы Olson, мне больше ничего не нужно, но я не нахожу API для обнаружения. Я не знаю, скрыта ли она где-нибудь или кто-то уже ее написал. Одна из проблем заключается в том, что текущий плагин временной зоны, по-видимому, сохраняет свои данные конфиденциальными.
I dont ' хочет решение, основанное на интеграции еще одной копии или извлечение таблиц Olson (что мне нужно было бы поддерживать), я знаю, что есть несколько библиотек, дублирующих их, я хотите использовать те, которые у меня уже есть в Moment.js.
теперь имеет API guess()
в качестве описанный здесь
Я сделал небольшой 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, чтобы угадать часовой пояс. Это, вероятно, лучшее решение прямо сейчас.
Если вы хотите использовать стандартный JavaScript API, вы можете использовать Intl.DateTimeFormat.resolvedOptions
, где есть поддержка браузера:
Intl.DateTimeFormat().resolvedOptions().timeZone; // "America/Los_Angeles"
resolvedOptions
в настоящее время (январь 2016) доступен во всех браузерах, кроме Safari на iOS и на рабочем столе: http://caniuse.com/#feat=internationalization
Однако свойство timeZone
в настоящее время доступно только в Chrome.
Там есть инструмент javascript, который делает именно это:
https://github.com/entraigas/jstz
Кажется, что имеет дело с неопределенностью часовых поясов.
В сочетании с часовым поясом momentJS вы можете получить часовой пояс и показать отформатированную дату:
var tzObj = jstz.determine();
var timezoneCode = tzObj.name();
console.log(moment.tz(timeZoneCode).format());