Автоматически определять текущее местное время пользователя с помощью JavaScript или PHP

Мне часто нужно отображать информацию, основанную на фактическом местном времени пользователя, которое зависит от часового пояса, или зависит от него. Есть ли надежный способ узнать текущее время и / или часовой пояс пользователя?

Ключевые вопросы:

  • Серверный код основан на хосте сайта или интернет-провайдере пользователя.
  • Код на стороне клиента основан на системных часах пользователя, которыми слишком легко манипулировать

Ключевые вопросы:

  • Нужно ли точно определять географическое местоположение пользователя?
  • Может ли время провайдера быть точным ориентиром?
  • Пользователи ОС часы могут отличаться или могут быть изменены пользователями?

Примеры:

Обратный отсчет:

Осталось всего 1 час 3 минуты 56 секунд!

Проблема: секунды, оставленные на основании чего; Часы ОС пользователя, время хост-сервера (плюс или минус смещение), системное время провайдера. Это легко, если часы заканчиваются одновременно для всех часовых поясов, но сложнее, если это обратный отсчет времени до полуночи в местном часовом поясе пользователя)

Редактировать журнал

Отправлен в 15:03 (10 секунд назад)

Проблема: "10 секунд" рассчитывается независимо от пользователя, время настраивается в соответствии с часовым поясом пользователя.

Время открытия:

Этот ресторан открыт сейчас до полуночи (AEST).

Проблема: указание времени, например, полуночи, можно рассчитать путем смещения со стороны сервера, но с использованием псевдо-времени, такого как сейчас, через 2 часа зависит от времени пользователя.

PHP: использование time() выводит время сервера. Это может быть смещено в зависимости от часового пояса пользователя.

JavaScript: использование Date() выводит время на компьютере пользователя, которым слишком легко манипулировать.

6 ответов

Решение

Короче нет.

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

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

Вы должны иметь возможность извлекать информацию о часовом поясе на стороне клиента с помощью javascript / Ajax, но, как и в случае самого времени, это также подвержено ошибкам.

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

С помощью JavaScript есть способ получить текущее смещение часового пояса пользователя.

new Date().getTimezoneOffset() * -1

возвращает смещение в минутах от GMT. Не сохраняйте это значение, так как оно может меняться в зависимости от летнего времени. Если вам это нужно на сервере (php), вам нужно будет перехватить его и отправить.

К сожалению, спецификация HTTP не отправляет часовой пояс пользователя в виде заголовка, а это то, что нужно php.

Я бы посоветовал вам написать дату сервера в javascript. Затем создайте новую дату в JavaScript, чтобы получить дату, установленную пользователем на его компьютере. Используйте разные в двух датах.

С датой сервера вы уверены, что ваше время беспристрастно. Все расчеты должны быть выполнены с использованием даты сервера.

Пользователь разница только для отображения. Это хорошо подойдет для редактирования журналов, обратного отсчета и выбора сообщений типа "Доброе утро".

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

PHP имеет как расширение PECL, так и пакет PEAR, который может выполнять поиск GeoIP. Если предположить, что пользователь не находится за прокси-сервером или NAT, база данных обновлена ​​и точна, а адрес вообще есть в базе данных, вы можете получить часовой пояс и рассчитать смещение по времени сервера.,

Или вы можете просто признать, что системные часы пользователя не на 100% точны, но обычно они очень близки. Все основные операционные системы имеют некоторый способ синхронизации своих часов с сетевыми серверами времени, большинство из которых включены по умолчанию. Если человек решил поместить свой компьютер в "неправильный" часовой пояс, это, вероятно, по какой-то причине (они путешествуют, они работают с людьми в другом часовом поясе).

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


Добавлено: Если часы вашего сервера точные (если нет, как сказал HermanD, исправьте их, если вы управляете сервером, пожалуйтесь, если нет), но не в правильном часовом поясе, вы всегда можете использовать PHP ini_set() или же date_default_timezone_set() заставить ваши скрипты работать в GMT, независимо от часового пояса системы.

JavaScript:

<script type="text/javascript">
var currentTime = new Date()
var hours = currentTime.getHours()
var minutes = currentTime.getMinutes()

if (minutes < 10){
  minutes = "0" + minutes;
}
var suffix = "AM";
if (hours >= 12) {
suffix = "PM";
hours = hours - 12;
}
if (hours == 0) {
hours = 12;
}

document.write("<b>" + hours + ":" + minutes + " " + suffix + "</b>");
</script>

выход

11:51

Я рекомендую использовать время сервера. В примере time() функция. Если вы основываетесь ВСЕ на этом значении, тогда ваша система будет защищена от любых конкретных операций, которые вам нужны.

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

Создайте модуль Javascript, который при загрузке страницы проверяет, отправил ли сервер время и, если это так, считывает значение и преобразует его в местное время JS, используя извлеченный или вычисленный часовой пояс JS. Затем вы можете сохранить его как глобальный JS или как статическую переменную в объекте или чем-то еще.

Другие вопросы по тегам