#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 goeswhile (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