Существует несколько проблем с решением, которое вы описали:
- Это чрезвычайно расточительно.В каждый компьютер в Интернете уже встроены часы с достаточно высокой точностью.
- Интернет всегда имеет задержку.К тому времени, когда пакет достигнет клиента, он будет старым.
- Интернет - это сеть с переменной задержкой, поэтому время обновления пакетов, которое вы получаете, может быть таким же высоким или большим, чем задержка на одну секунду для одного пакета,и всего за 20 мс для другого пакета.
Требуются сложные алгоритмы, чтобы иметь дело с № 2 и № 3.
Если вы на самом деле нужна точность второго уровня
Существует существующее стандартное для Интернета программное обеспечение, решающее эту проблему - Сетевой протокол времени .
Использование реального клиента NTP (неодин встроенный в Windows - , он только гарантирует, что с точностью до пары секунд ) будет синхронизировать ваш сервер с национальными стандартными NTP-серверами и встроить настоящий NTP-клиент в ваше приложение.Регулярно синхронизируйте время на вашем сервере и регулярно синхронизируйте время на клиенте (возможно, каждый раз, когда они входят / подключаются? Может быть, каждый час?).Затем просто используйте системные часы для расчета времени.
Не пытайтесь синхронизировать системное время клиента - у него может не быть доступа к нему, и уж точно не из браузера.Вместо этого вы можете получить эталонное время относительно системного времени и просто добавить разницу в качестве смещения при вычислениях на стороне клиента.
Если вам на самом деле не нужна точность второго уровня
Возможно, вам не нужно гарантировать точность с точностью до секунды.
Если вы примете это решение, вы можете немного упростить ситуацию.Просто передайте клиенту относительное время окончания для каждого аукциона, а не абсолютное время.Повторно запрашивайте его на стороне клиента очень часто (например, каждую минуту).Их глобальное системное время может быть не синхронизировано, но секундная стрелка на их часах должна довольно точно сбивать секунды.
Если вы хотите сделать это немного более скользким, вы можете попытаться определить (относительный) задержка для каждого звонка на сервер.Отслеживайте, сколько времени прошло между вызовами на сервер, и оставшееся время от предыдущего вызова.Сравните их.Затем вычислите, какое из этих значений меньше, и основывайте свое новое время на этом расчете.
Хотя я буду осторожен при разработке такого решения.Если вы ошиблись в вычислениях или имеете дело с неточными системными часами, вы можете сломать всю модель синхронизации или непреднамеренно заставить клиента предпочесть вызов с максимально высокой задержкой.Убедитесь, что вы учитываете все случаи, если вы пишете "гладкую" версию этого кода:)