Вопрос

В настоящее время я работаю над проектом, требующим, чтобы наше программное обеспечение работало как минимум до 2050 года.Недавно мы столкнулись с проблемами, связанными с "ошибкой" Y2.036K в протоколе NTP, а также с ошибкой Y2.038K.По сути, наше программное обеспечение должно продолжать работать после этих дат со всеми данными, записанными с использованием правильных временных меток.Учитывая, что в настоящее время нет решения ни для одной из этих ошибок, необходимо использовать обходной путь.

Крайне важно, чтобы наше программное обеспечение продолжало работать после этих двух событий и правильно записывало даты.Не критично, чтобы системное время операционной системы было правильным.Учитывая, что мы используем Java, мы должны быть в состоянии обрабатывать даты, относящиеся к начальной эпохе 1900 года, после ее завершения.Однако java JVM даже не будет запускаться, если системное время установлено до эпохи Unix в 1970 году!Он просто выходит из строя.

Чтобы подлить масла в огонь, NTP-сервер поставляется другим поставщиком, и мы не имеем над ним никакого контроля.Таким образом, использование другого протокола или модификация сервера для обработки всего этого невозможны.

Требуется творческое решение.Излишне говорить, что должно иметь место какое-то глубокое вуду.Мы рассмотрели следующее:

  1. Модифицируйте клиентское программное обеспечение ntpd, чтобы оно каким-то образом взаимодействовало с сервером ntp, и смещайте местное время с даты, превышающей эпоху Unix, в 1970, а не в 1900 году.Таким образом, позволяя JVM запускаться без сбоев при инициализации.Затем все временные метки будут обработаны относительно выбранной нами даты переноса.(Поэтому, в принципе, убедитесь, что мы переходим к дате, большей, чем эпоха Unix).

  2. Разрешите откорректированному времени ntp вернуться к эпохе 1900 и найдите исправление, чтобы JVM не вышла из строя.

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

Это было полезно?

Решение

Установите свое программное обеспечение на 64-разрядный Linux с 64-разрядной JVM. time_t и друзья здесь 64-разрядные, отрегулируйте время после 2038 года, посмотрите, работает ли все еще.Если у вас все хорошо, выбросьте NTP, найдите gps или другой источник, который можно использовать как точные часы и гарантирует, что у них не будет проблем с 32-разрядностью, настройте свое программное обеспечение для считывания / синхронизации времени с этого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top