Я работаю над живой подпиской для компании, которая отображает статус своего производственного графика в течение текущего 24-часового периода. Проблема в том, что некоторые из сотрудников должны иметь возможность просматривать этот живой канал из-за границы и в разные часовые пояса.
Есть два элемента, которые должны отображать текущее время «на месте» (сервер):
Часы, которые должны отображать текущее время на месте.
Индикатор выполнения, который показывает прогресс через текущий 24-часовой период на месте.
Я знаю, что синхронизация времени вживую неэффективна. Я не уверен, как сделать смещение времени на клиенте, чтобы он соответствовал серверу, потому что я мог столкнуться с рядом проблем:
Если у кого-нибудь есть опыт / идеи, чтобы помочь, это было бы высоко оценено.
благодаря
Время сервера должно быть в UTC. Таким образом, легче перемещать временные интервалы.
Не полагайтесь на клиента на часовой пояс, так как он зависит от машины клиента, которая может быть настроена на любое время и часовой пояс. У вас есть учетная запись, для которой требуется часовой пояс. Используйте это для смещения часового пояса. По той же причине, почему онлайн-сервисы запрашивают ваш часовой пояс, а не обнаруживают его.
Затем вы можете либо перейти на интервальную синхронизацию, либо сокеты. Обратите внимание, что латентность может задержать его на несколько секунд.
Интервальная синхронизация
Вы можете предоставить серверу исходное смещение времени и временной зоны. Рассчитайте начальное время клиента на основе этих исходных данных и попросите клиентскую сторону сделать отметку. Поскольку скрипт может выйти из синхронизации, вы периодически синхронизируются с сервером, как каждые 5 минут или около того.
Розетки
Попросите сервер рассчитать время пользователя в его часовом поясе и отправить его по линии через сокеты каждую секунду. Все, что вам нужно сделать на стороне клиента, это отобразить его.
Непосредственно с сайта MDN :
var x = new Date(); var currentTimeZoneOffsetInHours = x.getTimezoneOffset() / 60;
Это приведет к смещению часового пояса в минутах между временем по Гринвичу и местным временем (приведенный выше пример делит на 60 для преобразования в часы). Это уже учитывает летнее время.
Если ваш сервер помещает смещение часового пояса сервера в переменную на странице или отправляет ее с данными в реальном времени или если данные в реальном времени находятся в режиме UTC, вы можете рассчитать разницу между клиентом и данными.
Дайте вашим пользователям возможность выбрать часовой пояс, в котором они находятся (с помощью раскрывающегося списка или страницы параметров) и установить его с помощью встроенной функции php date_default_timezone_set.
date_default_timezone_set ( "Европа / Брюссель");
Затем разность времени между хост-сервером и пользователем рассчитывается автоматически, а также учитывается дневная экономия.
Документация находится здесь: https://php.net/manual/en/timezones.php
Затем отобразите время, используя функцию даты php:
дата ( "с"); // Дата ISO 8601