Як я можу зібрати інформацію про часовий пояс відвідувача? Мені потрібні Часовий пояс, а також години зміщення GMT.
Як я можу зібрати інформацію про часовий пояс відвідувача? Мені потрібні Часовий пояс, а також години зміщення GMT.
Відповіді:
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 JavaScript і зробити:
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()
, повністю залежить від ваших налаштувань мови. Очікувати результатів інших клієнтів схожих на ваші - дуже погана ідея.
Вже відповіли, як компенсувати за хвилини як ціле число, але у випадку, якщо хтось хоче, щоб локальний GMT змістився як рядок, наприклад "+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, як у моєму випадку ... я не впевнений, що математичний підлогу тощо буде кращою справою тут чи ні .... але це atleast дає мені +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);
З моментом.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 offset за лічені хвилини.
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/isissue?status=new&status=open )
Використовуйте це, щоб перетворити OffSet в postive:
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 (Центральноєвропейський стандартний час) {}"