Определить, изменились ли системные часы? - PullRequest
5 голосов
/ 15 июля 2009

Я смотрю на идею проекта Java, который определяет, когда часы компьютера были изменены. Идея состоит в том, чтобы записать дату и время на компьютерных часах и сохранить их в файле. Затем я хочу иметь возможность запускать на нем правила, которые показывают сообщение, если часы были изменены. Я также смотрю на включение правил, таких как «Разрешать изменения не более 5 минут». Это сделано для удобства изменения времени на нечетную минуту.

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

Я не уверен, есть ли уже система Java, которая делает это, на что я мог бы взглянуть, но я буквально не знаю, с чего начать.

Ответы [ 7 ]

1 голос
/ 29 июля 2009

Если я правильно понимаю ваш вопрос, то то, что вы пытаетесь сделать, предполагает, что изначально системные часы находятся в оптимальном состоянии. Затем через каждую минуту вы извлекаете последнюю запись в файле (либо последнюю, либо первую, независимо от выбранного вами метода) и убедитесь, что разница между этими двумя значениями времени составляет либо 60 секунд, либо любой другой интервал времени, который вы выбрали.

Пример: В момент времени 0 вы помещаете в файл 12:00:00 В момент времени 1 вы сравниваете 12:01:00 (который вы получаете из системных часов) с 12:00:00 (который вы получаете из файла) и считаете, что все в порядке, и записываете его в файл. ... В какое-то время n вы сравниваете xx: yy: zz, чья разница с последней записью не равна 60 секундам, поэтому изменение обнаружено. ...

Я полагаю, что правила , о которых вы говорите, включают извлечение последней записи из файла и сравнение с текущим временем, которое вы извлекли из системных часов. Является ли это хороший метод, однако, является спорным.

1 голос
/ 15 июля 2009

Если вы можете рассчитывать на наличие сетевого подключения, вы можете сравнить время со временем на сервере времени в Интернете (CBATG).

Просто конвертируйте местное время и выбранное время в один и тот же часовой пояс и сохраните разницу. Если разница изменяется более чем на 5 минут, вы знаете, что она была изменена.

1 голос
/ 15 июля 2009

В любом случае Java получает всю информацию о времени / дате от системных часов, поэтому нет никакой возможности узнать, были ли изменены базовые системные часы. Если вы возьмете дату и время и сохраните их в файле - это определит, было ли время установлено назад (т. Е. Время в файле соответствует текущему времени, а летнее время не произошло) - но оно не может определить, установлено ли время вперед (т. е. время в файле за 2 часа до текущего времени действительно истекло 2 часа, или пользователь установил часы на 2 часа вперед, пока программа не запущена?). Единственный способ сделать что-то подобное - использовать известный Сервер времени и вместо сохранения времени в файле сохранить смещение между сервером времени и часами локальной системы.

0 голосов
/ 10 июля 2016

Вы, кажется, просите две очень разные вещи:

  • Когда пользователь или системный администратор заставляет часы компьютера настраиваться или корректироваться до определенного момента (либо для установки истинного текущего времени-даты, либо для другого прошлого / будущего времени-даты для тестирования или гнусных целей).
  • Когда отображаемые часы-минуты изменяются для события, такого как Летнее время (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 не имеет смысла - время продолжало течь, а не искажаться, с одинаковым количеством проходящих секунд.

0 голосов
/ 15 июля 2009

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

0 голосов
/ 15 июля 2009

Хорошее место для использования библиотеки Joda time . Теоретически, вам нужно только проверить, перемещался ли местный часовой пояс между DST и не летним состоянием - если вы не хотите проверять местное время.

0 голосов
/ 15 июля 2009

Первое: часы часто меняются. Попробуйте использовать java.util.Timer для обновления. Календарь для вашей системы времени.

http://java.sun.com/javase/6/docs/api/ ваш друг в этом.

Начните с малого, по одному шагу за раз. Это мой совет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...