Как я могу собрать информацию о часовом поясе посетителя? Мне нужен часовой пояс, а также часы смещения по Гринвичу.
Как я могу собрать информацию о часовом поясе посетителя? Мне нужен часовой пояс, а также часы смещения по Гринвичу.
Ответы:
var offset = new Date().getTimezoneOffset();
console.log(offset);
Смещение часового пояса - это разница в минутах между UTC и местным временем. Обратите внимание, что это означает, что смещение является положительным, если местный часовой пояс отстает от UTC, и отрицательным, если оно впереди. Например, если ваш часовой пояс UTC + 10 (австралийское восточное стандартное время), будет возвращено -600. Летнее время не позволяет этому значению быть постоянным даже для данной локали
Обратите внимание, что не все часовые пояса смещены на целые часы: например, Ньюфаундленд - это UTC минус 3 ч 30 м (исключая летнее время из уравнения).
getTimezoneOffset
неточности? Статья, на которую вы ссылаетесь, датирована июнем 2007 года и не содержит подробностей о том, как эта функция является неточной. И на самом деле указанная jsTimezoneDetect
вами библиотека использует getTimezoneOffset
сама себя.
var hrs = -(new Date().getTimezoneOffset() / 60)
чтобы получить смещение в часах, которые обычно используются
timezone
! =utc offset
Использование смещения для расчета часового пояса - неправильный подход, и вы всегда будете сталкиваться с проблемами. Часовые пояса и правила перехода на летнее время могут меняться несколько раз в течение года, и сложно идти в ногу с изменениями.
Чтобы получить часовой пояс IANA системы в JavaScript, вы должны использовать
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
ecma-402 / 1.0 говорит, что timeZone
может быть неопределенным, если не предоставлено конструктору. Тем не менее, будущий проект (3.0) исправил эту проблему, изменив часовой пояс системы по умолчанию.
В этой версии API интернационализации ECMAScript
timeZone
свойство останется неопределенным, еслиtimeZone
в объекте параметров, предоставленномIntl.DateTimeFormat
конструктору, не было указано никакого свойства . Однако приложения не должны полагаться на это, поскольку будущие версии могут возвращать значение String, идентифицирующее текущий часовой пояс среды хоста.
в ecma-402 / 3.0, которая все еще находится в черновике
В этой версии API интернационализации ECMAScript 2015 это
timeZone
свойство будет именем часового пояса по умолчанию, еслиtimeZone
в объекте параметров, предоставленномIntl.DateTimeFormat
конструктору, свойство не было предоставлено . Предыдущая версия оставилаtimeZone
свойство неопределенным в этом случае.
Я понимаю, что этот ответ немного не по теме, но я думаю, что многие из нас, ищущих ответ, также хотели отформатировать часовой пояс для отображения и, возможно, получить сокращение зоны тоже. Так что вот так ...
Если вы хотите, чтобы часовой пояс клиента был правильно отформатирован, вы можете положиться на метод JavaScript Date.toString и выполнить:
var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];
Это даст вам «GMT-0400 (EST)», например, включая минуты часового пояса, когда это применимо.
Кроме того, с помощью регулярного выражения вы можете извлечь любую нужную часть:
Для «GMT-0400 (EDT)»:
new Date().toString().match(/([A-Z]+[\+-][0-9]+.*)/)[1]
Для «GMT-0400»:
new Date().toString().match(/([A-Z]+[\+-][0-9]+)/)[1]
Для просто "EDT":
new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]
Для всего "-0400":
new Date().toString().match(/([-\+][0-9]+)\s/)[1]
Ссылка Date.toString: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString
split[4] + " " + split[5]
?!
split
содержит: ["Mon", "Mar", "13", "2017", "14:05:22", "GMT-0400", "(Eastern", "Daylight", "Time)"]
так что результатDaylight Time)
new Date().toString()
, полностью зависит от ваших настроек локали. Ожидать, что результаты других клиентов будут напоминать ваши, - очень плохая идея.
На вопрос о том, как получить смещение в минутах в виде целого числа, уже отвечено, но в случае, если кто-то хочет локальное смещение по Гринвичу в виде строки, например "+1130"
:
function pad(number, length){
var str = "" + number
while (str.length < length) {
str = '0'+str
}
return str
}
var offset = new Date().getTimezoneOffset()
offset = ((offset<0? '+':'-')+ // Note the reversed sign!
pad(parseInt(Math.abs(offset/60)), 2)+
pad(Math.abs(offset%60), 2))
pad(parseInt(Math.abs(offset/60)), 2)
на правильное ... иначе вы можете получить +5,530, как в моем случае ... я не уверен, что математический пол и т. Д. Будет лучше или нет ... но это по крайней мере дает мне +0530, как и ожидалось
Ты можешь использовать:
<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>
// retrieve timezone by name (i.e. "America/Chicago")
moment.tz.guess();
Обнаружение часового пояса в браузере довольно сложно сделать правильно, так как браузер предоставляет мало информации.
Момент Timezone использует Date.getTimezoneOffset()
и Date.toString()
на несколько моментов вокруг текущего года , чтобы собрать как можно больше информации об окружающей среде браузера , как это возможно. Затем он сравнивает эту информацию со всеми загруженными данными часового пояса и возвращает наиболее близкое совпадение. В случае связи возвращается часовой пояс с городом с наибольшим населением.
console.log(moment.tz.guess()); // America/Chicago
Я написал функцию в своем проекте, которая возвращает часовой пояс в hh:mm
формате. Я надеюсь, что это может кому-то помочь:
function getTimeZone() {
var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
}
// Outputs: +5:00
Однострочник, который дает как смещение, так и часовой пояс, заключается в простом вызове toTimeString () для нового объекта Date. От MDN:
toTimeString()
Метод возвращает временную часть объекта Date в читабельной форме на американском английском.
Суть в том, что часовой пояс не в стандартном формате IANA; это несколько более удобно для пользователя, чем формат IANA "континент / город" . Попробуйте это:
console.log(new Date().toTimeString().slice(9));
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log(new Date().getTimezoneOffset() / -60);
В Калифорнии сейчас toTimeString()
возвращается, Pacific Daylight Time
а API-интерфейс Intl возвращается America/Los_Angeles
. В Колумбии вы получите Colombia Standard Time
, противAmerica/Bogota
.
Обратите внимание, что многие другие ответы на этот вопрос пытаются получить ту же информацию, вызывая Date.toString (). Этот подход не настолько надежен, как объясняет MDN :
Даты экземпляров относятся к конкретному моменту времени. Вызов toString () вернет дату, отформатированную в удобочитаемой форме на американском английском. [...] Иногда желательно получить строку времени; такая вещь может быть достигнута с помощью
toTimeString()
метода.Этот
toTimeString()
метод особенно полезен, потому что совместимые механизмы, реализующие ECMA-262, могут отличаться в строке, полученнойtoString()
дляDate
объектов, поскольку формат зависит от реализации; Простые подходы к нарезке строк могут не дать согласованных результатов для нескольких движков.
JavaScript:
var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
С moment.js :
moment().format('zz');
Z
иZZ
С momentjsВы можете найти текущий часовой пояс как
console.log(moment().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>
С dayjsВы можете найти текущий часовой пояс как
console.log(dayjs().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://unpkg.com/dayjs@1.8.10/dayjs.min.js"></script>
Оба API возвращают смещение utc в минутах.
getTimezoneOffset()
.
Часовой пояс в часах
var offset = new Date().getTimezoneOffset();
if(offset<0)
console.log( "Your timezone is- GMT+" + (offset/-60));
else
console.log( "Your timezone is- GMT-" + offset/60);
Если вы хотите быть точным, как вы упомянули в комментарии, то вы должны попробовать вот так:
var offset = new Date().getTimezoneOffset();
if(offset<0)
{
var extraZero = "";
if(-offset%60<10)
extraZero="0";
console.log( "Your timezone is- GMT+" + Math.ceil(offset/-60)+":"+extraZero+(-offset%60));
}
else
{
var extraZero = "";
if(offset%60<10)
extraZero="0";
console.log( "Your timezone is- GMT-" + Math.floor(offset/60)+":"+extraZero+(offset%60));
}
Если все, что вам нужно, это сокращение часового пояса "MST" или "EST":
function getTimeZone(){
var now = new Date().toString();
var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
return timeZone;
}
Date.toString()
не надежно, и MDN объясняет почему. Я вставил соответствующий раздел из их документов в своем ответе .
Посмотрите, этот результирующий оператор был противоположен часовому поясу. Так что примените некоторую математическую функцию, затем подтвердите число меньше или больше.
var a = new Date().getTimezoneOffset();
var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;
console.log(res)
round
? Так и должно быть floor
?
function getLocalTimeZone() {
var dd = new Date();
var ddStr = dd.toString();
var ddArr = ddStr.split(' ');
var tmznSTr = ddArr[5];
tmznSTr = tmznSTr.substring(3, tmznSTr.length);
return tmznSTr;
}
Пример: чт 21 июня 2018 18:12:50 GMT + 0530 (стандартное время Индии)
O / P: +0530
Date.toString()
не надежно, и MDN объясняет почему. Я вставил соответствующий раздел из их документов в своем ответе .
Попробуй это,
new Date().toString().split("GMT")[1].split(" (")[0]
Это значение с компьютера пользователя, и его можно изменить в любое время, поэтому я думаю, что это не имеет значения, я просто хочу получить приблизительное значение и затем преобразовать его в GMT на моем сервере.
Например, я из Тайваня, и он возвращает «+8» для меня.
JS
function timezone() {
var offset = new Date().getTimezoneOffset();
var minutes = Math.abs(offset);
var hours = Math.floor(minutes / 60);
var prefix = offset < 0 ? "+" : "-";
return prefix+hours;
}
$('#result').html(timezone());
HTML
<div id="result"></div>
Результат
+8
На new Date(
) вы можете получить смещение, чтобы получить имя часового пояса, которое вы можете сделать:
new Date().toString().replace(/(.*\((.*)\).*)/, '$2');
Вы получите значение ()
в конце даты, то есть название часового пояса.
Date.toString()
не надежно, и MDN объясняет почему. Я вставил соответствующий раздел из их документов в своем ответе . Также этот ответ был дан как минимум 3 раза.
Это было бы моим решением:
// For time zone:
const timeZone = /\((.*)\)/.exec(new Date().toString())[1];
// Offset hours:
const offsetHours = new Date().getTimezoneOffset() / 60;
console.log(`${timeZone}, ${offsetHours}hrs`);
В качестве альтернативы new Date().getTimezoneOffset()
и moment().format('zz')
, вы также можете использоватьmomentjs:
var offset = moment.parseZone(Date.now()).utcOffset() / 60
console.log(offset);
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>
jstimezone также довольно глючная и не поддерживается ( https://bitbucket.org/pellepim/jstimezonedetect/issues?status=new&status=open )
Используйте это, чтобы преобразовать OffSet в позитивное:
var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
Я искал только 3-буквенную строку (например, «PDT») и попробовал ответ Маркеса, но мне пришлось немного подправить его для поддержки кроссбраузерности. К счастью, строка является последним потенциальным совпадением :)
Вот что я сделал в CoffeeScript:
browserTimezone = ->
userDate = new Date()
zoneMatches = userDate.toString().match(/([A-Z][A-Z][A-Z])/g)
userZone = zoneMatches[zoneMatches.length - 1]
Работает в IE8, IE9, Safari 9, Firefox 44 и Chrome 48
Date.toString()
не надежно, и MDN объясняет почему. Я вставил соответствующий раздел из их документов в своем ответе .
Вы просто должны включить moment.js и jstz.js
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.6/jstz.min.js"></script>
и после этого
<script>
$(function(){
var currentTimezone = jstz.determine();
var timezone = currentTimezone.name();
alert(timezone);
});
</script>
Вы можете просто попробовать это. он вернет вам текущее машинное время
var _d = new Date(), t = 0, d = new Date(t*1000 + _d.getTime())
new Date(new Date().getTime());
нем будет отображаться: «Пт, 28 декабря 2018 10:15:23 GMT + 0100 (центральноевропейское стандартное время) {}»