【问题标题】:Java display current timeJava显示当前时间
【发布时间】:2012-11-28 11:20:50
【问题描述】:

我有一个代码显示我运行应用程序时的当前日期和时间

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:04:03 时,这也将在我的应用程序中
  • 是swing创建的web应用还是桌面应用?

标签: java date time timer


【解决方案1】:

如何使用计时器,例如javax.swing.Timer? (导入时不要搞错,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、web 等。所以我不会讨论这些细节。这里的基本方法适用于所有 UI 技术。

    两个基本思路:

    • 在您的用户界面中创建一个元素来表示当前时刻。可以是文本标签或花哨的小部件,例如动画钟面。
    • 后台线程定期捕获当前时刻以更新该 UI 元素的显示。小心后台线程如何进入 UI 线程。使用适当的 UI 技术来传达新的日期时间值并导致 UI 小部件更新。

    执行者

    对于 Swing,Swing Timer 可能是合适的(不确定该技术的当前状态)。但除此之外,学习如何使用ScheduledExecutorService 让一个单独的线程重复捕获当前时刻。搜索 Stack Overflow 以了解更多关于 Executor 的信息。

    java.time

    使用Instant 类以最高纳秒的分辨率捕捉UTC 时间轴上的当前时刻。

    Instant now = Instant.now();
    

    将该对象传递给 UI 线程。

    在 UI 线程上,应用用户所需/预期的时区 ZoneId 以生成 ZonedDateTime。

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

    如果您需要一个字符串来表示该日期时间调用toString 或使用DateTimeFormatter。注意DateTimeFormatter 上的ofLocalized… 方法。

    在 Stack Overflow 上搜索数百个相关问题和答案,了解更多详情。

    【讨论】:

      【解决方案3】:
          public void ShowTime() {
              new Timer(0, new ActionListener() {
                  @Override
                  public void actionPerformed(ActionEvent e) {
                      Date d = new Date();
                      SimpleDateFormat s = new SimpleDateFormat("dd/MM/yyy hh:mm:ss a");
                      time.setText(s.format(d));                 //time= jlabel 
                  }
              }).start();
          }
      

      不断改变时间(每秒刷新一次)

      【讨论】:

        【解决方案4】:

        你可以试试这个,

        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

        https://www.flowerbrackets.com/how-to-get-current-date-time-in-java/

        【讨论】:

        • 这个答案使用了麻烦的旧日期时间类,这些类现在是遗留的,几年前被大大改进的 java.time 类所取代。而且这段代码忽略了时区的关键问题。
        【解决方案5】:

        使用以 hh:mm 作为格式的简单日期格式化程序。

        SimpleDateFormat sdf = new SimpleDateFormat("HH:MM a");
        

        Click here for complete program.

        【讨论】:

          【解决方案6】:

          添加一个带有增量语句的循环,这样时钟会一直滴答作响,直到给定条件。

          【讨论】:

          • 很糟糕的主意!,循环不打算这样做,而是使用胎面。
          猜你喜欢
          • 2018-12-04
          • 2020-06-21
          • 1970-01-01
          • 2014-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-11
          • 2014-05-18
          相关资源
          最近更新 更多