Текущее время отображения Java

У меня есть код, который показывает мне текущую дату и время при запуске моего приложения

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
System.out.println(dateFormat.format(cal.getTime()));

Теперь он показывает мне: 2012/12/11 00:36:53, когда я запускаю его.

Но я хочу, чтобы он подсчитывал время во время его запуска.

Итак, пример теперь, когда я запускаю его в 00:37:53, показывает это время, но я хочу 00:37:53 при запуске, и я прекращаю его запуск в 00:40:55. Я хочу, чтобы он показывал мне 00:37:53, 00:37:54, 00:37:55 и т.д.

Теперь, как я могу это сделать?

Ответ 1

Как использовать таймер, например javax.swing.Timer? (Не ошибайтесь при импорте, есть больше классов таймера.)

public static void main(String... args) throws InterruptedException {
    final DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    int interval = 1000; // 1000 ms

    new Timer(interval, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            Calendar now = Calendar.getInstance();
            System.out.println(dateFormat.format(now.getTime()));
        }
    }).start();

    Thread.currentThread().join();
}

Это будет просто выполнять тело ActionListener каждую секунду, печатая текущее время.

Вызов Thread.join на последней строке не является общепринятым, он просто необходим для этого примера, часть кода запускается до тех пор, пока процесс не будет остановлен вручную. В противном случае он немедленно остановится.

В реальном приложении, если это приложение Swing, таймер должен обрабатывать потоки отдельно, поэтому вам не придется беспокоиться об этом.


Изменить

Интеграция приведенного выше примера в ваше приложение довольно проста, просто добавьте его в метод initGUI и вместо того, чтобы печатать текущее время в System.out, измените текст данной метки:

public void initGUI() {
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);        
    setPreferredSize(new Dimension(800, 600));
    setLayout(null);

    Calendar now = Calendar.getInstance();
    tijd = new JLabel(dateFormat.format(now.getTime()));
    tijd.setBounds(100, 100, 125, 125);
    window.add(tijd);

    new Timer(1000, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            Calendar now = Calendar.getInstance();
            tijd.setText(dateFormat.format(now.getTime()));
        }
    }).start();

    pack();
}

Ответ 2

Вы не упоминаете техническую платформу своего пользовательского интерфейса, например Swing, SWT, Vaadin, сеть или так далее. Поэтому я не буду рассматривать эти особенности. Основной подход здесь применим ко всем технологиям пользовательского интерфейса.

Две основные идеи:

  • Создайте элемент в пользовательском интерфейсе, чтобы представить текущий момент. Может быть текстовая метка или причудливый виджет, такой как анимированная циферблата.
  • Фоновый поток регулярно фиксирует текущий момент обновления для отображения этого элемента пользовательского интерфейса. Будьте осторожны с тем, как фоновый поток попадает в поток пользовательского интерфейса. Используйте соответствующий метод пользовательского интерфейса для передачи нового значения даты и времени, чтобы обновить виджет пользовательского интерфейса.

Палач

Для Swing таймер Swing может быть подходящим (не уверен в текущем состоянии этой технологии). Но в противном случае узнайте, как использовать ScheduledExecutorService, чтобы иметь отдельный поток, который многократно фиксирует текущий момент. Поиск, чтобы узнать больше об этом Executor.

java.time

Используйте класс Instant, чтобы зафиксировать текущий момент на временной шкале в формате UTC с разрешением до наносекунд.

Instant now = Instant.now();

Передайте этот объект в поток пользовательского интерфейса.

В потоке пользовательского интерфейса примените желаемый/ожидаемый часовой пояс пользователей ZoneId для создания ZonedDateTime.

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZobedDateTime zdt = instant.atZone( z ) ;

Если вам нужен String для представления вызова с датой toString или используйте DateTimeFormatter. Обратите внимание на методы ofLocalized… на DateTimeFormatter.

Поиск для многих сотен связанных вопросов и ответов для более подробной информации.

Ответ 4

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

Ответ 5

Вы можете попробовать это,

import java.awt.*;
import java.awt.event.*;
import java.util.Date;
import java.lang.Thread;

public class TimeInSeconds extends Frame implements Runnable
{
    private Label lblOne;
    private Date dd;
    private Thread th;

    public TimeInSeconds()
    {
        setTitle("Current time");
        setSize(200,150);
        setVisible(true);
        setLayout(new FlowLayout());
        addWindowListener(new WindowAdapter() {
            public void windowClose(WindowEvent we){
                System.exit(0);
            }
        });
        lblOne = new Label("00:00:00");
        add(lblOne);

        th = new Thread(this);
        th.start(); // here thread starts
    }

    public void run()
    {
        try
        {
            do
            {
                dd = new Date();
                lblOne.setText(dd.getHours() + " : " + dd.getMinutes() + " : " + dd.getSeconds());
                Thread.sleep(1000);  // 1000 = 1 second
            }while(th.isAlive());
        }
        catch(Exception e)
        {

        }
    }

    public static void main(String[] args)
    {
        new TimeInSeconds();
    }
}

Вы можете запустить эту программу и получить результат.

Для получения дополнительной информации о дате и времени в java вы можете ссылаться на ссылки ниже,

https://docs.oracle.com/javase/tutorial/datetime/iso/datetime.html

https://docs.oracle.com/javase/7/docs/api/java/sql/Date.html

http://www.flowerbrackets.com/date-time-java-program/