Как поставить отметку по внешнему времени в C#? - PullRequest
0 голосов
/ 26 мая 2020

Есть этот API, который при вызове дает мне время удаленного сервера. Это ответ JSON этого API:

{
    hour: 12,
    minute: 2,
    second: 20,
    msFormat: "/Date(1590478340707)/"
}

На этот раз c не синхронизируется с сервером, на котором работает мой код. И мне нужна точность в миллисекундах для моего кода в соответствии со временем удаленного сервера.

Я хочу вызвать другой API этого сервера, точно в зависимости от некоторого времени относительно этого сервера. Таким образом, я не могу использовать DateTime.Now моего собственного сервера, потому что они не синхронизированы c. У моего сервера и удаленного сервера один и тот же год, один и тот же месяц, один и тот же день, но иногда они могут быть отключены на несколько часов.

Я видел этот вопрос , но ответы предполагают, что у меня есть доступ к коду JavaScript на этом сервере, чтобы получить время. Я не. Я также видел этот вопрос , но он касается отправки времени моего собственного клиента на мой сервер. И, как я уже сказал, у меня нет доступа к созданию даты и времени JavaScript. У меня есть доступ только к данным, показанным выше.

Теперь мне нужно:

  1. Анализировать на этот раз точно так же, как есть, с точностью до миллисекунд
  2. На основе тиков на этот раз, чтобы я мог сделать что-то точно в какой-то момент времени, относительно него

Я хотел попробовать new DateTime(year, month, day, hour, minute, second, millisecond), но у меня нет количества миллисекунд (это в последний параметр называется msFormat, и я не знаю его, пока не извлечу его, чего я не знаю).

Я попробовал new DateTime(1970, 01, 01).AddMilliseconds(1590478340707), что дает мне неправильное время, потому что я знаю он выключен даже по времени удаленного сервера.

Я тоже пробовал new System.Timers.Timer(1).Elapsed += HandleTimeBasedOnRemoteServerTime;. Но теперь я не знаю, как узнать время этого сервера, потому что я не могу использовать DateTime.Now.

Не могли бы вы помочь?

1 Ответ

1 голос
/ 27 мая 2020

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

Если вы не можете этого сделать по какой-то причине должна быть возможность повторно использовать исходный код ntp в качестве библиотеки и создавать фальшивые сообщения из имеющихся у вас данных. Но с таким количеством уровней абстракции точность вашей оценки времени может никогда не достичь 1 мс.

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

Вы уверены, что серверы не просто находятся в разных часовых поясах? Всегда проверяйте, что вы рассчитываете время как UT C, даже если вам нужно отображать / редактировать значения в местных часовых поясах. Для этого DateTimeOffset - гораздо лучший тип данных, так как он может правильно сохранить информацию о часовом поясе источника. должно быть ясно об использовании UT C. Проще было бы использовать конструктор тиков;

new DateTime(1590478340707 * 1000, DateTimeKind.Utc);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...