Получить имя часового пояса
Можно ли получить имя часового пояса клиента с помощью jQuery?
Пример: Pacific S.A. Standard Time, Greenwich Standard Time, например: https://en.wikipedia.org/wiki/List_of_time_zones_by_country
Timezonelist
Ответы
Ответ 1
Можно ли получить имя часового пояса клиента с помощью jQuery?
Нет. jQuery имеет только одну функцию даты/времени, которая $.now()
.
Если вы имели в виду JavaScript, ответа по-прежнему нет. Вы можете получить только смещение часового пояса от date.getTimezoneOffset()
. Вы не можете получить часовой пояс - по крайней мере, не во всех браузерах. См. раздел wiki темы часового пояса: "Time Zone != Offset"
Вы можете догадаться в часовом поясе, используя библиотеку jsTimeZoneDetect, но это всего лишь предположение. Это может быть или не быть точным.
Вы также можете использовать moment.js с момент -timezone добавить. Теперь он поддерживает догадки часового пояса с помощью moment.tz.guess()
.
Если вы можете гарантировать, что ваши пользователи работают в среде, полностью поддерживающей API интернационализации ECMAScript, вы можете получить часовой пояс пользователя это:
Intl.DateTimeFormat().resolvedOptions().timeZone
Вы можете просмотреть таблицу совместимости в разделе DateTimeFormat
- resolvedOptions().timezone defaults to the host environment
, чтобы определить, в каких средах это будет работать.
Честно говоря, самое лучшее, что нужно сделать, это просто дать вашему пользователю экран где-нибудь, чтобы они могли выбрать свой часовой пояс. Вы можете использовать раскрывающийся список, или вы можете использовать сборщик часовых поясов на основе карты - как этот. Вы можете использовать jsTimeZoneDetect в качестве значения по умолчанию, но ваш пользователь должен иметь возможность его изменить.
Кроме того, все они предоставят вам идентификатор часового пояса IANA, например America/Los_Angeles
. Но приведенные вами примеры выглядят как идентификаторы часовых поясов Windows (для использования с TimeZoneInfo
в .net). Вы должны прочитать wiki темы часового пояса, а затем также этот вопрос: Как перевести между часами WAN и IANA?
Ответ 2
Вывод new Date()
равен Wed Aug 14 2013 22:02:13 GMT-0700 (Pacific Daylight Time)
, можете ли вы его использовать? Если вам не нужно официальное имя, вы можете просто использовать то, что находится между круглыми скобками
function getTimeZone() {
return /\((.*)\)/.exec(new Date().toString())[1];
}
getTimeZone(); // Pacific Daylight Time
Ответ 3
В качестве альтернативы ниже приведен способ получения часового пояса с чистым javascript:
(new Date).toString().split('(')[1].slice(0, -1)
Ответ 4
Получить текущее стандартное имя часового пояса:
function getTimezoneName() {
var timeSummer = new Date(Date.UTC(2005, 6, 30, 0, 0, 0, 0));
var summerOffset = -1 * timeSummer.getTimezoneOffset();
var timeWinter = new Date(Date.UTC(2005, 12, 30, 0, 0, 0, 0));
var winterOffset = -1 * timeWinter.getTimezoneOffset();
var timeZoneHiddenField;
if (-720 == summerOffset && -720 == winterOffset) { timeZoneHiddenField = 'Dateline Standard Time'; }
else if (-660 == summerOffset && -660 == winterOffset) { timeZoneHiddenField = 'UTC-11'; }
else if (-660 == summerOffset && -660 == winterOffset) { timeZoneHiddenField = 'Samoa Standard Time'; }
else if (-660 == summerOffset && -600 == winterOffset) { timeZoneHiddenField = 'Hawaiian Standard Time'; }
else if (-570 == summerOffset && -570 == winterOffset) { timeZoneHiddenField.value = 'Pacific/Marquesas'; }
// else if (-540 == summerOffset && -600 == winterOffset) { timeZoneHiddenField.value = 'America/Adak'; }
// else if (-540 == summerOffset && -540 == winterOffset) { timeZoneHiddenField.value = 'Pacific/Gambier'; }
else if (-480 == summerOffset && -540 == winterOffset) { timeZoneHiddenField = 'Alaskan Standard Time'; }
// else if (-480 == summerOffset && -480 == winterOffset) { timeZoneHiddenField = 'Pacific/Pitcairn'; }
else if (-420 == summerOffset && -480 == winterOffset) { timeZoneHiddenField = 'Pacific Standard Time'; }
else if (-420 == summerOffset && -420 == winterOffset) { timeZoneHiddenField = 'US Mountain Standard Time'; }
else if (-360 == summerOffset && -420 == winterOffset) { timeZoneHiddenField = 'Mountain Standard Time'; }
else if (-360 == summerOffset && -360 == winterOffset) { timeZoneHiddenField = 'Central America Standard Time'; }
// else if (-360 == summerOffset && -300 == winterOffset) { timeZoneHiddenField = 'Pacific/Easter'; }
else if (-300 == summerOffset && -360 == winterOffset) { timeZoneHiddenField = 'Central Standard Time'; }
else if (-300 == summerOffset && -300 == winterOffset) { timeZoneHiddenField = 'SA Pacific Standard Time'; }
else if (-240 == summerOffset && -300 == winterOffset) { timeZoneHiddenField = 'Eastern Standard Time'; }
else if (-270 == summerOffset && -270 == winterOffset) { timeZoneHiddenField = 'Venezuela Standard Time'; }
else if (-240 == summerOffset && -240 == winterOffset) { timeZoneHiddenField = 'SA Western Standard Time'; }
else if (-240 == summerOffset && -180 == winterOffset) { timeZoneHiddenField = 'Central Brazilian Standard Time'; }
else if (-180 == summerOffset && -240 == winterOffset) { timeZoneHiddenField = 'Atlantic Standard Time'; }
else if (-180 == summerOffset && -180 == winterOffset) { timeZoneHiddenField = 'Montevideo Standard Time'; }
else if (-180 == summerOffset && -120 == winterOffset) { timeZoneHiddenField = 'E. South America Standard Time'; }
else if (-150 == summerOffset && -210 == winterOffset) { timeZoneHiddenField = 'Mid-Atlantic Standard Time'; }
else if (-120 == summerOffset && -180 == winterOffset) { timeZoneHiddenField = 'America/Godthab'; }
else if (-120 == summerOffset && -120 == winterOffset) { timeZoneHiddenField = 'SA Eastern Standard Time'; }
else if (-60 == summerOffset && -60 == winterOffset) { timeZoneHiddenField = 'Cape Verde Standard Time'; }
else if (0 == summerOffset && -60 == winterOffset) { timeZoneHiddenField = 'Azores Daylight Time'; }
else if (0 == summerOffset && 0 == winterOffset) { timeZoneHiddenField = 'Morocco Standard Time'; }
else if (60 == summerOffset && 0 == winterOffset) { timeZoneHiddenField = 'GMT Standard Time'; }
else if (60 == summerOffset && 60 == winterOffset) { timeZoneHiddenField = 'Africa/Algiers'; }
else if (60 == summerOffset && 120 == winterOffset) { timeZoneHiddenField = 'Namibia Standard Time'; }
else if (120 == summerOffset && 60 == winterOffset) { timeZoneHiddenField = 'Central European Standard Time'; }
else if (120 == summerOffset && 120 == winterOffset) { timeZoneHiddenField = 'South Africa Standard Time'; }
else if (180 == summerOffset && 120 == winterOffset) { timeZoneHiddenField = 'GTB Standard Time'; }
else if (180 == summerOffset && 180 == winterOffset) { timeZoneHiddenField = 'E. Africa Standard Time'; }
else if (240 == summerOffset && 180 == winterOffset) { timeZoneHiddenField = 'Russian Standard Time'; }
else if (240 == summerOffset && 240 == winterOffset) { timeZoneHiddenField = 'Arabian Standard Time'; }
else if (270 == summerOffset && 210 == winterOffset) { timeZoneHiddenField = 'Iran Standard Time'; }
else if (270 == summerOffset && 270 == winterOffset) { timeZoneHiddenField = 'Afghanistan Standard Time'; }
else if (300 == summerOffset && 240 == winterOffset) { timeZoneHiddenField = 'Pakistan Standard Time'; }
else if (300 == summerOffset && 300 == winterOffset) { timeZoneHiddenField = 'West Asia Standard Time'; }
else if (330 == summerOffset && 330 == winterOffset) { timeZoneHiddenField = 'India Standard Time'; }
else if (345 == summerOffset && 345 == winterOffset) { timeZoneHiddenField = 'Nepal Standard Time'; }
else if (360 == summerOffset && 300 == winterOffset) { timeZoneHiddenField = 'N. Central Asia Standard Time'; }
else if (360 == summerOffset && 360 == winterOffset) { timeZoneHiddenField = 'Central Asia Standard Time'; }
else if (390 == summerOffset && 390 == winterOffset) { timeZoneHiddenField = 'Myanmar Standard Time'; }
else if (420 == summerOffset && 360 == winterOffset) { timeZoneHiddenField = 'North Asia Standard Time'; }
else if (420 == summerOffset && 420 == winterOffset) { timeZoneHiddenField = 'SE Asia Standard Time'; }
else if (480 == summerOffset && 420 == winterOffset) { timeZoneHiddenField = 'North Asia East Standard Time'; }
else if (480 == summerOffset && 480 == winterOffset) { timeZoneHiddenField = 'China Standard Time'; }
else if (540 == summerOffset && 480 == winterOffset) { timeZoneHiddenField = 'Yakutsk Standard Time'; }
else if (540 == summerOffset && 540 == winterOffset) { timeZoneHiddenField = 'Tokyo Standard Time'; }
else if (570 == summerOffset && 570 == winterOffset) { timeZoneHiddenField = 'Cen. Australia Standard Time'; }
else if (570 == summerOffset && 630 == winterOffset) { timeZoneHiddenField = 'Australia/Adelaide'; }
else if (600 == summerOffset && 540 == winterOffset) { timeZoneHiddenField = 'Asia/Yakutsk'; }
else if (600 == summerOffset && 600 == winterOffset) { timeZoneHiddenField = 'E. Australia Standard Time'; }
else if (600 == summerOffset && 660 == winterOffset) { timeZoneHiddenField = 'AUS Eastern Standard Time'; }
else if (630 == summerOffset && 660 == winterOffset) { timeZoneHiddenField = 'Australia/Lord_Howe'; }
else if (660 == summerOffset && 600 == winterOffset) { timeZoneHiddenField = 'Tasmania Standard Time'; }
else if (660 == summerOffset && 660 == winterOffset) { timeZoneHiddenField = 'West Pacific Standard Time'; }
else if (690 == summerOffset && 690 == winterOffset) { timeZoneHiddenField = 'Central Pacific Standard Time'; }
else if (720 == summerOffset && 660 == winterOffset) { timeZoneHiddenField = 'Magadan Standard Time'; }
else if (720 == summerOffset && 720 == winterOffset) { timeZoneHiddenField = 'Fiji Standard Time'; }
else if (720 == summerOffset && 780 == winterOffset) { timeZoneHiddenField = 'New Zealand Standard Time'; }
else if (765 == summerOffset && 825 == winterOffset) { timeZoneHiddenField = 'Pacific/Chatham'; }
else if (780 == summerOffset && 780 == winterOffset) { timeZoneHiddenField = 'Tonga Standard Time'; }
else if (840 == summerOffset && 840 == winterOffset) { timeZoneHiddenField = 'Pacific/Kiritimati'; }
else { timeZoneHiddenField = 'US/Pacific'; }
return timeZoneHiddenField;
}
Ответ 5
Нашел это script Я использую с moment.js:
http://pellepim.bitbucket.org/jstz/
Этот script позволяет получить имя часового пояса браузера, например, в этом примере:
> var timezone = jstz.determine();
> timezone.name();
"America/New_York"
Это не в jQuery, однако...
Ответ 6
Не могу придумать, как это сделать, используя JQuery. Вы можете получить имя страны удаленного пользователя с помощью PHP, а затем сравнить результат с:
1) массив стран, которые применяют время экономии света (не так много).
2) текущая дата.
Чтобы получить страну-пользователя:
function visitor_country() {
$ip = $_SERVER["REMOTE_ADDR"];
if(filter_var(@$_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP))
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
if(filter_var(@$_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP))
$ip = $_SERVER['HTTP_CLIENT_IP'];
$result = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=" . $ip))
->geoplugin_countryName;
return $result <> NULL ? $result : "Unknown";
}
echo visitor_country(); // Output Country name [Ex: United States]
?>
Ссылка на карту мира Time Zones можно использовать для создания массива: http://www.worldtimezone.com/daylight.html
Надеюсь, эта идея будет работать для вас!
Ответ 7
Эти ссылки могут помочь вам timeZone с использованием JQuery
или следующий код может помочь вам выйти из
var offset = (new Date()).getTimezoneOffset();
alert(offset);
checkout JSFIddle или для дальнейшего объяснения посетите Решение Scott
Только для часового пояса
function get_time_zone_offset( ) {
var current_date = new Date();
alert(current_date);
//return -current_date.getTimezoneOffset() / 60;
}
Всплывающее окно предупреждения также покажет часовой пояс, который вы можете изменить в соответствии с вашим требованием, проверьте его в JS Fiddle
Ответ 8
используя момент .js + moment-timezones.js
moment.tz.guess();
https://github.com/moment/moment-timezone/issues/138
Ответ 9
В чистом javascript, использующем регулярное выражение,
var d = new Date();
var s = d.toString();
var zoneName = s.match(".*(\\((.*)\\))")[2];
Ответ 10
Нет прямого пути, но вы можете сделать это:
var dd = new Date();
var d = dd.toString();
var startOff = d.indexOf('(') + 1;
var endOff = d.lastIndexOf(')');
var str = d.substring(startOff, endOff);
Я создал скрипт JS, где вы видите предупреждения:
JSFiddle
var dd = new Date();
var d = dd.toString();
alert(d);
var startOff= d.indexOf('(') + 1;
alert(startOff);
var endOff= d.lastIndexOf(')');
alert(startOff+ " : " + endOff);
var str = d.substring(startOff , endOff);
alert(str);
Ответ 11
Я знаю, что этот вопрос старый, но вот небольшое решение, которое я придумал:
(new Date).toLocaleString('en-US', {
hour12: false,
hour: '2-digit',
timeZoneName: 'long'
}).replace(/^\d\d /, '');
Я не тестировал это широко, но для моего браузера это дает мне:
"Mountain Daylight Time"
Надеюсь, это поможет кому-то там.