IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
Время в UTC с NTP сервера
AdamHasker
сообщение 9.1.2015, 19:41
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 3
Регистрация: 9.1.2015
Пользователь №: 2936



Можно ли с NTP сервера получить время UTC в миллисекундах. Например так, как это сделано здесь www.windowsfaq_ru/serv/directtime/track.php?id=time_utc

Я спрашиваю не только о вашем сервере, а вообще. Есть ли стандарт для этой темы?

Спасибо.
Перейти в начало страницы
 
+Цитировать сообщение
AdamHasker
сообщение 9.1.2015, 19:42
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 3
Регистрация: 9.1.2015
Пользователь №: 2936



Цитата(AdamHasker @ 9.1.2015, 19:41) *
www.windowsfaq_ru/serv/directtime/track.php?id=time_utc


Извините, так как форум не разрешил разместить ссылку, то пришлось её «спрятать».
Перейти в начало страницы
 
+Цитировать сообщение
Admin
сообщение 9.1.2015, 20:28
Сообщение #3


Администратор
***

Группа: Главные администраторы
Сообщений: 271
Регистрация: 18.12.2007
Из: Саратов
Пользователь №: 1



То что Вы предоставили по ссылке - есть обычный Unix Timestamp (с миллисекундами). NTP-сервер же передает время (временной штамп) в своем своем особом формате, согласно описанию протокола формат такой:
Цитата(http://www.opennet.ru/docs/RUS/inet_book/4/44/ntp_4415.html)
Временные метки NTP представляют собой 64-битные числа с фиксированной запятой без знака, которое указывает число секунд с нуля часов 1-го января 1900 года. Целая часть содержит первые 32 разряда, а дробная часть остальные 32 разряда.

Получить сам штамп можно обратившись к NTP-серверу в соответствии с протоколом. В зависимости от Вашего ПО, реализация может быть разная.

Далее полученный штамп необходимо будет конвертировать в Unix Timestamp. Для этого можно применить формулу: UT = (TS / 1000) - 2208988800.

Ранее для реализации часов на сайте ntp-servers.net мы поступали проще. Наш скрипт обращался к NTP-серверу используя стандартную команду ntpq -crv, и затем обрабатывал ее вывод (смотрел значение переменной clock) и получал текущее время, которое преобразовывалось в Unix Timestamp через php-функцию strtotime() и передавалось в JavaScript.

Скорее всего у windowsfaq все сделано аналогичным образом, либо они используют библиотеку для прямой работы с NTP, например такую: https://github.com/majetzx/ntplite.

Данная библиотека позволяет получать время с NTP-сервера в виде Unix Timestamp (с миллисекундами) таким образом:
Код
<?php
require_once 'NTPLite.php';

$server = 'ntp1.stratum2.ru';
$timestamp = 0;

if ($socket = @stream_socket_client('udp://'.$server.':123', $errno, $errstr, 3))
{
    $ntp = new NTPLite(FALSE);

    $ntp->versionNumber = 3;
    $ntp->mode = 3;

    fwrite($socket, $ntp->writeMessage());

    if ($ntp->readMessage(fread($socket, 1500)))
    {
        $timestamp = floor((($ntp->transmitTimestamp / 1000) -
                NTPLite::SNTP_TO_UNIX_TS_INTERVAL) * 1000);
    }

    fclose($socket);
}

echo 'Timestamp: '.$timestamp;
?>


--------------------


Перейти в начало страницы
 
+Цитировать сообщение
AdamHasker
сообщение 9.1.2015, 20:42
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 3
Регистрация: 9.1.2015
Пользователь №: 2936



Цитата(Admin @ 9.1.2015, 20:28) *


Спасибо за исчерпывающий ответ.

Увы, но PHP для моих целей не пригоден. Так что… Буду изобретать велосипед.

Ещё раз — спасибо.
Перейти в начало страницы
 
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 27.7.2017, 21:38
Материалы сайта предназначены для лиц 12 лет и старше.
HSDN — Рейтинг сайтов