Intereting Posts
Как использовать расширение PHP DOM loadHTML Как извлечь атрибут узла из XML с помощью PHP DOM Parser Постоянство сеанса между несколькими доменами? Как анализировать json-ответ от CURL Laravel 4.1 Запуск миграции и настройка конфигурации из зависимостей пакетов Выполнить скрипт PHP внутри Joomla! cms один раз – перенаправление на основе геоданных В Zf2, как добавить ошибку css-класс при проверке не удалось Быстрый код, не обновляющий базу данных MySQL Как включить Google App Engine для PHP в мои скрипты / автозагрузку? Шифрование (большие) файлы в PHP с помощью openSSL как получить контент с внешней веб-страницы по php? Woocommerce – php для получения информации о заказе Получить текущее использование полосы пропускания в Linux с помощью PHP Вставка изображения с помощью PHP и FPDF, не удалось загрузить большое изображение Группировка mysql по категориям и отображение их в группы по каждой категории

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

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

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

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

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

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

Примеры:

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

Всего 1 час, 3 минуты, 56 секунд!

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

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

Сообщение опубликовано в 3:03 pm (10 секунд назад)

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

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

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

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

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

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

Короче нет.

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

Вы могли бы рассчитать часовые пояса по умолчанию для пользователей на основе эвристики вокруг своего 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 утра

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

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

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