Динамическое отображение времени на Java

#java #time

#java #время

Вопрос:

Я пытаюсь создать Java-приложение, которое отображает текущее время в разных городах. Но мне нужно, чтобы оно отображалось на консоли. Моя проблема в том, что я могу сделать это с помощью цикла, но он выводит новую строку, когда время меняется. Мне интересно, есть ли способ заставить отображать время в реальном времени, не печатая его в новую строку снова и снова. Спасибо за помощь.

Комментарии:

1. Было бы здорово показать, что у вас есть (код), что вы получаете (вывод) и чего вы ожидаете

Ответ №1:

сделайте так, чтобы оно отображалось на консоли

Для командной строки Window я знаю, что печать a r в конце строки вместо n or rn вернет курсор в начало текущей строки, поэтому следующий напечатанный текст будет напечатан поверх предыдущего текста.

Я не знаю, работает ли это в Linux.

Я знаю, что он не работает в панелях вывода консоли некоторых IDE, например r , ведет себя как n в Eclipse.

Помимо предостережений, в командной строке Windows в следующей строке будут отображаться текущие часы в одной строке:

 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
for (;;) { // loop forever
    LocalTime time = LocalTime.now();
    System.out.print(time.format(formatter)   "r");
    TimeUnit.NANOSECONDS.sleep(1_000_000_000 - time.getNano());
}
 

Примечание 1: Код использует print() , а не println() , поскольку ln будет печатать rn то, что нам не нужно.

Примечание 2: он печатает поверх существующего текста, он не очищает строку, поэтому, если строка печатается Hello Worldr тогда Goodbyer , результатом является текст Goodbyeorld . Вам нужно заполнить пробелами, чтобы очистить любой существующий текст. Это, конечно, не проблема с выводом с фиксированной шириной, например HH:mm:ss .

Комментарии:

1. Хороший ответ. Подробности: Хотя for (;;) это идиома C для бесконечного цикла, идиома Java goes while (true) , которая более четко выражает намерение. Вместо того, чтобы делать математику времени, я нахожу TimeUnit.NANOSECONDS.sleep(nanosToWait) более элегантным.

2. @OleV.V. Кто сказал while (true) , что идиома Java для бесконечного цикла? Я предпочитаю for (;;) , поскольку оно читается почти как «навсегда». — Например, Baeldung показывает 3 способа написания бесконечного цикла, но не показывает предпочтения одного над другим.

Ответ №2:

Вопрос: Мне интересно, есть ли способ отображения… без перевода строки.

Ответ: Да.

Проблема в том, что у вас, похоже, есть приложение консольного режима, которое использует System.out.println() (или эквивалент). Решение состоит в том, чтобы использовать «что-то еще».

  • В идеале вы можете использовать графический интерфейс, например Java Swing
  • В качестве альтернативы, если вам все еще нужно приложение в консольном режиме, вы можете использовать библиотеку типов «curses» для Java. Например: библиотеки Terminal и ncurses Java