Как получить часовой пояс пользователя с помощью jquery?

#php #jquery #timezone

#php #jquery #Часовой пояс

Вопрос:

Я хотел бы получить их часовой пояс с такими названиями, как ‘Азия / Калькутта’ или ‘Австралия / Дарвин’

У меня на myserver установлен php, и для его времени установлено значение ‘UTC’

Ответ №1:

Для определения смещения часового пояса вы можете использовать эту функцию:

 function get_time_zone_offset( ) {
  var current_date = new Date();
  return parseInt(-current_date.getTimezoneOffset() / 60);
}
  

Пример вы можете увидеть здесь

Ответ №2:

Это мой первый пост здесь, но, надеюсь, я смогу кому-нибудь помочь. Я чувствовал себя обязанным, потому что этот сайт мне очень помог. Спасибо участникам stackoverflow!

http://www.pageloom.com/automatic-timezone-detection-with-javascript

Насколько я понимаю, этот код JavaScript очень точен и сможет возвращать смещение от UST, соответствующее название часового пояса базы данных Olson, и обрабатывать проблему перехода на летнее время (например, -5:00, Америка / New_york, true).

http://www.php.net/manual/en/timezones.america.php

Приведенная выше ссылка — это всего лишь список поддерживаемых php параметров часового пояса, которые, насколько я могу судить, соответствуют этому коду JavaScript (я уверен, что это полезно, я просто не знаю, почему я все еще пишу свой код, и я вроде как новичок в php / mysql).

Единственным препятствием, с которым вы столкнетесь после того, как этот код заработает на вашей html-странице, скорее всего, будет передача этих значений в php, а затем в mysql, если это то, что вам нужно. Я добился этого, отправив эти значения в виде $.post с помощью jQuery. Я думаю, что это самый простой способ сделать это (пожалуйста, кто-нибудь, поправьте меня, если я ошибаюсь). Я полагаю, что другие альтернативы используют команду AJAX (более сложную) или cookies (я думаю?).

После того, как я получил значения из кода Java-script на сервер (PHP), я сохранил их как переменные сеанса, чтобы они изменились, если пользователь на моем сайте войдет в систему из другого часового пояса, чем обычно. Однако их также можно легко сохранить в базе данных.

Если вы используете маршрут jQuery, это должно быть в заголовке html-документа, в котором выполняется $.post.

  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
  

Самый обновленный скрипт timezonedetect можно найти по ссылке на тот первый URL, который я опубликовал.

 //replace this comment with the most updated timezonedetect code from that first link
var timezone = jstz.determine_timezone();
var tzoffset = timezone.offset();
var tzname = timezone.name();
var tzdst = timezone.dst();
$.post("scripts/tzdetect.php", { tzoffset: tzoffset, tzname: tzname, tzdst: tzdst } );
  

Принимающий файл в данном случае tzdetect.php должно выглядеть так, если вы хотите, чтобы данные хранились как переменные сеанса.

 <?php
session_start();
$_SESSION['tzname'] = $_POST['tzname'];
$_SESSION['tzoffset'] = $_POST['tzoffset'];
$_SESSION['tzdst'] = $_POST['tzdst'];
?>
  

Ответ №3:

Ваш вопрос на самом деле касается Javascript, а не PHP — потому что это зависит от возможностей клиента.

Насколько я понимаю, Javascript позволяет вам определять текущее смещение часового пояса (разницу между UTC и местным временем), но это не позволяет вам однозначно определить часовой пояс. Многие часовые пояса будут иметь одинаковое смещение в любой конкретный момент времени, но будут отличаться в другое время с точки зрения того, соблюдают ли они переход на летнее время и в какой момент они переходят на летнее время и из него.

Если вам определенно нужен часовой пояс, вы можете составить список возможных часовых поясов и представить его пользователю, что также позволит ему переопределить решение об сужении, выбрав любой часовой пояс.

Опять же, это действительно зависит от того, чего вы пытаетесь достичь.

Комментарии:

1. Где я могу получить этот список часовых поясов для хранения в php array? допустим, если смещение равно «new Date().getTimezoneOffset() / 60» .. доступно ли это значение в моем массиве?

2. @user967144: В каком массиве? Не совсем понятно, о чем вы спрашиваете. Чтобы определить возможные часовые пояса, вы должны перебрать все часовые пояса и найти те, которые имеют одинаковое смещение. Вы можете найти все часовые пояса с помощью DateTimeZone::listIdentifiers .

3. я нашел ссылку здесь, не могли бы вы взглянуть на функцию, опубликованную BrightNail? codingforums.com/showthread.php?t=139888

4. @user967144: Это не является ни полным, ни авторитетным. Может быть несколько часовых поясов, которые имеют одинаковое смещение дневного света, одинаковое стандартное смещение, но меняются в разное время.

5. Итак, каков наилучший способ? Что я действительно ищу, так это узнать название часового пояса браузера, чтобы я мог изменить свое расписание для них. Мне, должно быть, нужны названия часовых поясов, потому что я использую функцию DateTime в php

Ответ №4:

Для этого вам не нужен jQuery. Попробуйте следующий код:

 var offset = (new Date()).getTimezoneOffset();
alert(offset);
  

Это предупредит о текущем смещении часового пояса из браузера (в минутах).

Смотрите этот jsfiddle в качестве доказательства.

Я думаю, вам нужно будет преобразовать его в название часового пояса самостоятельно. Если вы хотите, чтобы имена были согласованными, вы не должны зависеть от браузера пользователя.

Вы можете использовать этот код (см. Этот jsfiddle):

 var offset = (new Date()).getTimezoneOffset();

var timezones = {
    '-12': 'Pacific/Kwajalein',
    '-11': 'Pacific/Samoa',
    '-10': 'Pacific/Honolulu',
    '-9': 'America/Juneau',
    '-8': 'America/Los_Angeles',
    '-7': 'America/Denver',
    '-6': 'America/Mexico_City',
    '-5': 'America/New_York',
    '-4': 'America/Caracas',
    '-3.5': 'America/St_Johns',
    '-3': 'America/Argentina/Buenos_Aires',
    '-2': 'Atlantic/Azores',
    '-1': 'Atlantic/Azores',
    '0': 'Europe/London',
    '1': 'Europe/Paris',
    '2': 'Europe/Helsinki',
    '3': 'Europe/Moscow',
    '3.5': 'Asia/Tehran',
    '4': 'Asia/Baku',
    '4.5': 'Asia/Kabul',
    '5': 'Asia/Karachi',
    '5.5': 'Asia/Calcutta',
    '6': 'Asia/Colombo',
    '7': 'Asia/Bangkok',
    '8': 'Asia/Singapore',
    '9': 'Asia/Tokyo',
    '9.5': 'Australia/Darwin',
    '10': 'Pacific/Guam',
    '11': 'Asia/Magadan',
    '12': 'Asia/Kamchatka' 
};

alert(timezones[-offset / 60]);
  

Однако я бы не стал слишком полагаться на это.

Комментарии:

1. приятно, что он предупреждает «-330».. теперь, как я могу изменить его, чтобы показать ‘Азия / Калькутта’?

2. @user967144: Смотрите обновленную версию, теперь появляется имя, которое вы ожидаете.

3. @user967144: Нет, это ненадежно — оно основано на смещении, поэтому часовой пояс будет меняться в зависимости от того, действует переход на летнее время или нет. Но я не вижу другого варианта, если вы хотите полагаться на данные из браузера. Это лучшее решение.

4. Другой способ сделать это — сравнить временную метку компьютера (используя date в javascript) с временной меткой с сервера. Затем вы можете вычислить разницу. Я видел, как эта функция getTimezoneOffset() время от времени выходит из строя

5. Это не «ненадежно», это просто неправильно. Часовой пояс — это набор правил, применяемых к определенному региону. Смещение во времени зависит от времени года и от текущего набора правил (например, Россия недавно отказалась от перехода на летнее время). Невозможно угадать часовой пояс только по одному смещению. jstz делает это довольно хорошо, и он выполняет гораздо больше проверок.

Ответ №5:

Вы можете получить смещение часового пояса. Который вы можете использовать для вычисления приблизительного часового пояса. Вы можете сохранить ассоциативный список смещения часового пояса и names . Однако этот метод не дает никаких точных значений.

Комментарии:

1. Вы не можете вычислить часовой пояс по смещению часового пояса. Вы можете составить список возможных часовых поясов, но их вполне может быть больше одного. И вы говорите, что это «не требуется», но это полностью зависит от того, что должна делать операционная система. Например, чтобы вычислить, каким будет местное время через 10 минут, смещения часового пояса недостаточно.

2. @JonSkeet Спасибо! Вы абсолютно правы, вы можете получить только приблизительный часовой пояс из смещения. Редактирование ответа.

Ответ №6:

 <?
echo date("e");
?>
  

Это даст результат:

Asia/Kolkata

Комментарии:

1. Мне нужен часовой пояс браузера, а не серверов