当前位置: 首页 > 知识库问答 >
问题:

如何在Java中刷新日期对象中的时间?[重复]

阮阳曦
2023-03-14

在Java中,如何在不创建新实例的情况下更新/刷新日期对象中的时间?下面的代码可以工作,但我不想为计时器创建两次新实例。有没有更好的方法来实现这一点?在我的实际代码中,我需要在一个循环中完成这项工作,而我不能每次都创建一个新实例。我只想创建一次对象,然后尽可能将其更新到当前时间。

public static void main(String[] args)
{
    Date timer;
    long startTime_ms, endTime_ms;
    long timeDifference_ms;
    timer = new Date();
    startTime_ms = timer.getTime();
    System.out.println("Start time [ms]: " + startTime_ms);
    // 250ms delay
    try
    {
        Thread.sleep(250); // It seems sleep commands always require a try in Java
    }
    catch (InterruptedException e)
    {
        System.out.println("Error while waiting!");
        e.printStackTrace();
    }
    timer = new Date();
    endTime_ms = timer.getTime();
    timeDifference_ms = endTime_ms-startTime_ms;
    System.out.println("End time [ms]: " + endTime_ms);
    System.out.println("Time difference [m]: " + timeDifference_ms);
}

上面代码的输出是:

开始时间[ms]:1647614880579

结束时间[ms]:1647614880841

时差[m]:262

共有2个答案

陈晟睿
2023-03-14

第一个想法是:来吧,只是做一个新对象。这不会是你代码中最大的垃圾来源。

不要使用java.util.日期或日历,因为1.8有一个java.time的api。所有这些类都是不可变的,没有用新数据更新它们。如果你不知何故被困在1.8之前的java上,还有Joda时间。

替代方法:您可以使用long来保存时间戳,而不是Date。Date是一个围绕长值的包装。您可以在不创建新对象的情况下随意更新它(只要您不做会导致自动装箱的事情)。

郭建华
2023-03-14

我不会用Date类来获取毫秒。就我个人而言,我喜欢使用:
系统。currentTimeMillis()
这是一个简单的方法,不创建任何变量,并返回毫秒的长值使用代码的示例:

public static void Main(String[] args){
    long startTime_ms, endTime_ms;
    long timeDifference_ms;
    startTime_ms = System.currentTimeMillis();
    System.out.println("Start time [ms]: " + startTime_ms);
    // 250ms delay
    try
    {
        Thread.sleep(250); // It seems sleep commands always require a try in Java
    }
    catch (InterruptedException e)
    {
        System.out.println("Error while waiting!");
        e.printStackTrace();
    }
    endTime_ms = System.currentTimeMillis();
    timeDifference_ms = endTime_ms-startTime_ms;
    System.out.println("End time [ms]: " + endTime_ms);
    System.out.println("Time difference [m]: " + timeDifference_ms);
}

这在大多数情况下都很好,但也可能会出现一些小错误。另一种选择是使用系统。nanoTime()用于更精确的计算和不基于日期的计算

long start_nano, end_nano;
long time_difference_nano;
start_nano = System.nanoTime();
try{Thread.sleep(100);}
catch(Exception e){
    System.out.println("Error!");
    e.printStackTrace();
}
end_nano = System.nanoTime();
time_difference_nano = end_nano-start_nano;
System.out.println("End time [ms]: " + end_nano);
System.out.println("Time difference [m]: " + time_difference_nano);

 类似资料:
  • 问题内容: 我用Java 创建了一个对象。当我这样做时,它显示如下:。结果,我的Excel文件似乎减少了一天(27 feb变为26 feb,依此类推),我认为这一定是因为时间的缘故。如何将其设置为下午5:30? 问题答案: 另请参阅 乔达时间 日历文件

  • 问题内容: 我在一个包含日期/时间的网格中有一个字段,我需要知道该日期和当前日期/时间之间的区别。这样做的最佳方法是什么? 日期存储为。 问题答案: 这将为您提供两个日期之间的时差,以毫秒为单位 在您的示例中, 您需要确保这是一个有效的对象。 这样的事情可能会为您工作 即变成,这是构造函数可以理解的格式。

  • 问题内容: 如何分辨两个datetime物体之间的时间差(以分钟为单位)? 问题答案: 从第一次减去以后的时间将创建一个仅保留时差的对象。在上面的示例中,它是0分钟,8秒和562000微秒。

  • 问题内容: 有没有一种简单的方法可以从pytz日期时间对象中删除时区? 例如,在此示例中进行重构: 问题答案: 要从日期时间对象中删除时区(tzinfo): 如果您使用的是诸如arrow的库,则可以通过简单地将arrow对象转换为datetime对象,然后执行与上述示例相同的操作来删除时区。 你为什么要这样做?一个例子是mysql不支持DATETIME类型的时区。因此,使用ORM之类的sqlalc

  • 我有一个pandas数据框,其中有一列应该表示一个财政季度的结束。格式为“Q1-2009”类型。是否有一种快速的方法将这些字符串转换为时间戳“2009-03-31”? 我发现只有格式“YYYY-QQ”的转换,但没有相反的转换。

  • 我在Netbeans IDE中用JDBC oracle数据库做一个Java项目,我需要在数据库中插入日期和时间,它的格式是11/16/2013 10:30。我把我的代码附在下面。 在DBConnector中插入代码 按钮单击事件 Logger.GetLogger(CabCancellationUI.Class.GetName()).Log(Level.Severe,null,ex);}}捕获(Ex