Я знаю, как получить смещение часового пояса, но мне нужна возможность определять что-то вроде «Америка / Нью-Йорк». Возможно ли это даже из JavaScript, или это то, что мне нужно будет предположить на основе смещения?
Я знаю, как получить смещение часового пояса, но мне нужна возможность определять что-то вроде «Америка / Нью-Йорк». Возможно ли это даже из JavaScript, или это то, что мне нужно будет предположить на основе смещения?
Ответы:
В API Интернационализация поддерживает получение часового пояса пользователя, и поддерживаются во всех современных браузерах.
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
Имейте в виду, что в некоторых старых версиях браузеров, поддерживающих API интернационализации, для timeZone
свойства установлено значение, undefined
а не строка часового пояса пользователя. Насколько я могу судить, на момент написания (июль 2017 г.) все текущие браузеры, кроме IE11, будут возвращать часовой пояс пользователя в виде строки.
Ответ, получивший наибольшее количество голосов, вероятно, является лучшим способом получить часовой пояс, однако Intl.DateTimeFormat().resolvedOptions().timeZone
возвращает имя часового пояса IANA по определению, которое находится на английском языке.
Если вы хотите, чтобы название часового пояса было на языке текущего пользователя, вы можете проанализировать его из Date
строкового представления следующим образом:
function getTimezoneName() {
const today = new Date();
const short = today.toLocaleDateString(undefined);
const full = today.toLocaleDateString(undefined, { timeZoneName: 'long' });
// Trying to remove date from the string in a locale-agnostic way
const shortIndex = full.indexOf(short);
if (shortIndex >= 0) {
const trimmed = full.substring(0, shortIndex) + full.substring(shortIndex + short.length);
// by this time `trimmed` should be the timezone's name with some punctuation -
// trim it from both sides
return trimmed.replace(/^[\s,.\-:;]+|[\s,.\-:;]+$/g, '');
} else {
// in some magic case when short representation of date is not present in the long one, just return the long one as a fallback, since it should contain the timezone's name
return full;
}
}
console.log(getTimezoneName());
Проверено в Chrome и Firefox.
Конечно, в некоторых средах это не будет работать должным образом. Например, node.js возвращает смещение по Гринвичу (например GMT+07:00
) вместо имени. Но я думаю, что это все еще можно прочитать как запасной вариант.
PS Не будет работать в IE11, как и Intl...
решение.
Вы можете использовать этот скрипт. http://pellepim.bitbucket.org/jstz/
Репозиторий форк или клонов здесь. https://bitbucket.org/pellepim/jstimezonedetect
После того, как вы включите скрипт, вы можете получить список часовых поясов в jstz.olson.timezones
переменной.
И следующий код используется для определения часового пояса клиентского браузера.
var tz = jstz.determine();
tz.name();
Наслаждайтесь jstz!
Получить часовой пояс по названию (например, "Америка / Нью-Йорк")
moment.tz.guess();
Intl.DateTimeFormat().resolvedOptions().timeZone
Intl.DateTimeFormat().resolvedOptions().timeZone
возвращает undefined
, но moment.tz.guess()
возвращает правильное значение
Вы можете просто написать свой собственный код, используя таблицу сопоставления здесь: http://www.timeanddate.com/time/zones/
или используйте библиотеку моментных часовых поясов: http://momentjs.com/timezone/docs/
Видеть zone.name; // America/Los_Angeles
или эта библиотека: https://github.com/Canop/tzdetect.js
Это получает код часового пояса (например, GMT
) в более старом javascript (я использую скрипт приложения Google со старым движком):
function getTimezoneName() {
return new Date().toString().get(/\((.+)\)/);
}
Я просто кладу это сюда на случай, если кому-то это понадобится.
UTC
/ GMT
. Похоже, что другие прописаны; например, Pacific Daylight Time
.
Попробуйте этот код, обратитесь отсюда
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js">
</script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.4/jstz.min.js">
</script>
<script type="text/javascript">
$(document).ready(function(){
var tz = jstz.determine(); // Determines the time zone of the browser client
var timezone = tz.name(); //'Asia/Kolhata' for Indian Time.
alert(timezone);
});
</script>
В javascript метод Date.getTimezoneOffset () возвращает смещение часового пояса от UTC в минутах для текущей локали.
var x = new Date();
var currentTimeZoneOffsetInHours = x.getTimezoneOffset() / 60;
Moment'timezone будет полезным инструментом. http://momentjs.com/timezone/
Преобразование дат между часовыми поясами
var newYork = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london = newYork.clone().tz("Europe/London");
newYork.format(); // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format(); // 2014-06-01T17:00:00+01:00