Перейти к содержанию
Fire Monkey от А до Я
  • 0

Получение времени от серверов времени


Bob32

Вопрос

Опубликовано

Добрый день!

подскажите пожалуйста, а есть компоненты, либо другой проверенный способ, чтобы получать точное время от каких-либо централизованных служб в Инете?

 

мне нужно синхронизировать по времени события на разных телефонах.

Рекомендуемые сообщения

  • 0
Опубликовано

если даже не использовать NTP

При каждом HTTP запросе в ответе приходят заголовки. Например

Connection: keep-alive
Strict-Transport-Security: max-age=0
Content-Encoding: 
Content-Type: text/html; charset=utf-8
Date: Fri, 05 Apr 2019 07:02:28 GMT
Server: nginx
 

  • 0
Опубликовано
4 часа назад, krapotkin сказал:

если даже не использовать NTP

При каждом HTTP запросе в ответе приходят заголовки. Например

Connection: keep-alive
Strict-Transport-Security: max-age=0
Content-Encoding: 
Content-Type: text/html; charset=utf-8
Date: Fri, 05 Apr 2019 07:02:28 GMT
Server: nginx
 

Те - брать и читать какой-нить урл и брать время из заголовков? 

А NTP время как отдают? Может есть у кого-то пример кода?

  • 0
Опубликовано

TIdTime is a client implementation of the Time Protocol as described in the Internet Standards document:

RFC 868 - Time Protocol (http://www.rfc-editor.org/rfc/rfc868.txt)

Time is a simple protocol for synchronizing time on a local network. For a time protocol with higher accuracy over several networks, use TIdSNTP. To retrieve the current date and time in human-readable form, use TIdDayTime.

Please note that the Time Protocol in its current form cannot handle most dates after the year 2035. This limitation is stated in RFC 868.

  • 0
Опубликовано

Протокол SNTP

 

Помимо NTP, существует упрощенная версия этого протокола - SNTP (Simple Network Time Protocol). Он реализован для синхронизации времени конечным клиентом, поскольку все преимущества протокола NTP проявляются именно в сети серверов, а для получения показаний конечным пользователем NTP излишне сложен. Поэтому для синхронизации времени конечными компьютерами и серверами был предложен протокол SNTP (SNTPv3: 1992 г., RFC1361 и 1995 г., RFC1769; SNTPv4 включён как подпротокол в NTPv4).

На самом деле SNTP - это не новый протокол, а способ использования NTP-пакетов и NTP-серверов в приложениях, где не требуется высокоточное время, либо оно недостижимо. В этом случае клиент использует только часть информации UDP-пакета NTP-сервера. SNTP-клиент может работать с любыми версиями NTP-серверов, и кроме них - с особыми SNTP-серверами, которые в откликах заполняют только необходимые данные UDP-пакета.

Таким образом, "облегченный" SNTP образует не сеть синхронизирующихся серверов, а пары "клиент-сервер". Любой NTP-сервер является одновременно SNTP-сервером. Клиент, который не передаёт полученное время дальше, может работать как NTP- или SNTP-клиент, в зависимости от условий. Для SNTP, как и для NTP, зарезервирован 123-й UDP-порт.

 

Uses IdSNTP, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient;
....
procedure TForm1.Button2Click(Sender: TObject);
Var IdSNTP: TIdSNTP;
begin
  IdSNTP:=TIdSNTP.Create(Self);
  IdSNTP.Host := 'ntp1.stratum2.ru';
  ShowMessage(DateTimeToStr(IdSNTP.DateTime));
  IdSNTP.Free;
end;

 

  • 0
Опубликовано
10 часов назад, Евгений Корепов сказал:

Протокол SNTP

 

Помимо NTP, существует упрощенная версия этого протокола - SNTP (Simple Network Time Protocol). Он реализован для синхронизации времени конечным клиентом, поскольку все преимущества протокола NTP проявляются именно в сети серверов, а для получения показаний конечным пользователем NTP излишне сложен. Поэтому для синхронизации времени конечными компьютерами и серверами был предложен протокол SNTP (SNTPv3: 1992 г., RFC1361 и 1995 г., RFC1769; SNTPv4 включён как подпротокол в NTPv4).

На самом деле SNTP - это не новый протокол, а способ использования NTP-пакетов и NTP-серверов в приложениях, где не требуется высокоточное время, либо оно недостижимо. В этом случае клиент использует только часть информации UDP-пакета NTP-сервера. SNTP-клиент может работать с любыми версиями NTP-серверов, и кроме них - с особыми SNTP-серверами, которые в откликах заполняют только необходимые данные UDP-пакета.

Таким образом, "облегченный" SNTP образует не сеть синхронизирующихся серверов, а пары "клиент-сервер". Любой NTP-сервер является одновременно SNTP-сервером. Клиент, который не передаёт полученное время дальше, может работать как NTP- или SNTP-клиент, в зависимости от условий. Для SNTP, как и для NTP, зарезервирован 123-й UDP-порт.

 


Uses IdSNTP, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient;
....
procedure TForm1.Button2Click(Sender: TObject);
Var IdSNTP: TIdSNTP;
begin
  IdSNTP:=TIdSNTP.Create(Self);
  IdSNTP.Host := 'ntp1.stratum2.ru';
  ShowMessage(DateTimeToStr(IdSNTP.DateTime));
  IdSNTP.Free;
end;

 

Спасибо огромное персонально!

Все работает!

Но время отдается в каком-то американском часовом поясе (отличается от московского на 10 часов).

хелп на класс TIdSNTP у меня почему-то отсутствует. (

можно конечно по колхозному к московскому времени привести, но может есть более правильный метод (или свойство) этого класса?

  • 0
Опубликовано
55 минут назад, Bob32 сказал:

Но время отдается в каком-то американском часовом поясе

У меня совпадает с московским

время.png

  • 0
Опубликовано

Стоял левый часовой пояс в настройках телефона. Поставил московский -время изменилось но, снова не в том часовом поясе. ;) 

Сейчас показывает 7:27, а должно 13:27

  • 0
Опубликовано
28 минут назад, Bob32 сказал:

Стоял левый часовой пояс в настройках телефона. Поставил московский -время изменилось но, снова не в том часовом поясе. ;) 

Сейчас показывает 7:27, а должно 13:27

Посмотрите исходники модуля IdSNTP - там все достаточно просто (всего 300 строк кода). Может пошаговый дебаг поможет понять откуда берется ошибка. На винде у меня правильное время отдает, на андроиде не пробовал.

  • 0
Опубликовано (изменено)
50 минут назад, Bob32 сказал:

Стоял левый часовой пояс в настройках телефона. Поставил московский -время изменилось но, снова не в том часовом поясе. ;) 

Сейчас показывает 7:27, а должно 13:27

Какая версия среды у вас и какая версия Indy? Возможно проблема в старой версии Indy, погуглите "delphi indy OffsetFromUTC" - там были какие то проблемы, и вроде они исправлены.

У меня вот такая версия (в Rio с последним апдейтом). Узнать версию - киньте любой компонент Indy на форму, правой кнопкой по компоненту и About. 

image.png.809e6947de20e9528bfd9fdbcd8e82b7.png

Повторюсь - на андроиде я не проверял правильность работы.

Изменено пользователем Евгений Корепов
  • 0
Опубликовано
1 час назад, Евгений Корепов сказал:

Какая версия среды у вас и какая версия Indy? Возможно проблема в старой версии Indy, погуглите "delphi indy OffsetFromUTC" - там были какие то проблемы, и вроде они исправлены.

У меня вот такая версия (в Rio с последним апдейтом). Узнать версию - киньте любой компонент Indy на форму, правой кнопкой по компоненту и About. 

image.png.809e6947de20e9528bfd9fdbcd8e82b7.png

Повторюсь - на андроиде я не проверял правильность работы.

Версия, такая же, как у Вас.

попробую вот это как стемнеет )

 

DB48E037-7D0F-4863-8EFC-8D94B46E8FD5.png

  • 0
Опубликовано
В ‎06‎.‎04‎.‎2019 в 16:19, Евгений Корепов сказал:

Интересно! Обязательно сообщите результаты! )))

руки дошли только сегодня и то пока криво )

файл нашел, скопировал в директорию проекта, и там отредактировал.

но этот файл  IdGlobalProtocols.pas - это не в чистом виде модуль библиотеки Indi.

Что значит "add the edited file to your project"? просто списать в каталог проекта - этого вероятно будет недостаточно )

  • 0
Опубликовано
В ‎06‎.‎04‎.‎2019 в 16:19, Евгений Корепов сказал:

Интересно! Обязательно сообщите результаты! )))

а если заменить исходный файл - то как перекомпилить Инди?

  • 0
Опубликовано (изменено)
4 часа назад, Bob32 сказал:

руки дошли только сегодня и то пока криво )

файл нашел, скопировал в директорию проекта, и там отредактировал.

но этот файл  IdGlobalProtocols.pas - это не в чистом виде модуль библиотеки Indi.

Что значит "add the edited file to your project"? просто списать в каталог проекта - этого вероятно будет недостаточно )

Просто закиньте в паку с проектом, этого думаю достаточно.

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

Изменено пользователем Евгений Корепов

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...