Вы, кажется, просите две очень разные вещи:
- Когда пользователь или системный администратор заставляет часы компьютера настраиваться или корректироваться до определенного момента (либо для установки истинного текущего времени-даты, либо для другого прошлого / будущего времени-даты для тестирования или гнусных целей).
- Когда отображаемые часы-минуты изменяются для события, такого как Летнее время (DST) .
Часы манипуляции
Во-первых, нет хорошего простого способа сделать это. Вы можете иногда сэмплировать текущую дату и время, записать ее, а затем сэмплировать позже. Вы должны сделать это в UTC , чтобы избежать ошибочных изменений DST как изменения пользователя / sysadmin.
Пример кода с использованием классов java.time. Избегайте старых устаревших классов, не относящихся к java.time, поскольку они плохо спроектированы, сбивают с толку и создают проблемы.
Instant now1 = Instant.now(); // Record, run again, compare.
String now1AsString = now1.toString(); // Ex: 2011-12-03T10:15:30.724Z
…
Instant now2 = Instant.now();
Boolean timeWentBackwards = now2.isBefore( now1 );
Конечно, вы не можете использовать эту технику для приспособления к будущему, только к прошлому. Часы всегда движутся в будущее.
Единственный надежный способ обнаружить приставание к часам - это иметь более одного часа. Вам необходим надежный доступ (подключение) к доверенным часам, возможно, либо к серверу времени в вашей сети, либо к серверу времени в Интернете. Даже тогда, имея только пару часов, может быть сложно. Как гласит старая морская пословица: «Возьми на борт один или три компаса».
DST опрокидывания
Обнаружение изменений летнего времени не имеет значения. Общая лучшая практика работы с датой и временем - работа в UTC. Это включает в себя большую часть вашей бизнес-логики, хранения данных и обмена данными.
Помните: переход на летнее время вперед или назад с DST не имеет смысла - время продолжало течь, а не искажаться, с одинаковым количеством проходящих секунд.