如何在修改后更新Java日历?

时间:2013-02-18 10:42:07

标签: java time calendar

我正在编写一个程序,其中包含显示当前时间的标题。我想允许用户修改日期/时间设置。但在用户修改后,我无法让日历保持最新状态。它始终显示用户输入的值。例如:

Calendar cal = Calendar.getInstance();
System.out.println(cal.getTime());
cal.set(Calendar.MONTH, Calendar.SEPTEMBER);
try {
    Thread.sleep(2000);
} catch (InterruptedException e) {
    e.printStackTrace();
}
System.out.println(cal.getTime());

假设第一个输出是

Mon Feb 18 11:33:07 CET 2013

我想要的是在2秒后获得第二个输出

Mon Sep 18 11:33:09 CET 2013 // Month = Sep and Seconds = 09

我得到的是

Mon Sep 18 11:33:07 CET 2013 // Month = Sep, seconds don't change, still 07!!

如果我在第二个输出之前添加cal = Calendar.getInstance();,我会得到

Mon Feb 18 11:33:09 CET 2013 // Seconds = 09, month doesn't change, still Feb!!

我认为必须有一个我无法找到的简单而明显的实现。

更新:我无法在我正在使用的嵌入式系统上使用DateFormat。

4 个答案:

答案 0 :(得分:3)

日历未更新,因为在创建对象时或明确设置时间时将设置日历的时间。在你的情况下,它在此行之后设置。

Calendar cal = Calendar.getInstance();

如果你真的想这样做,你需要找到经过的时间并增加日历时间,如下所示,

long startTime = System.currentTimeMillis(); // Process start time

try {
    Thread.sleep(2000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

// Calculating elapse time
long elapsedTime = System.currentTimeMillis() - startTime;
// Incrementing the calendar time based on elapsed time
cal.setTimeInMillis(cal.getTime().getTime() + elapsedTime);

答案 1 :(得分:2)

CalendarDate只是快照。创建后,它们不会自行更新。

无论您选择哪种方式,每次要更新显示时都必须创建一个新的。然后对新快照进行调整。

如果您希望Java在更改月份时更改计算机的时间,请参阅此帖子:How can I set the System Time in Java?

答案 2 :(得分:1)

您应该将月份存储为偏移量,而不是添加月份,然后尝试使用正确的秒数再次计算时间。每次您希望获得更新时间计算实时,然后添加偏移时间。

您可以将偏移时间计算为long并将其添加到实时。然而,这是一个更简单的例子 -

Calendar start = Calendar.getInstance();
System.out.println(start);
//add offset
int monthsOffset = 3;
//get new time
start.add(Calendar.MONTH, monthsOffset);
System.out.println(start);

答案 3 :(得分:0)

对于您的问题,您需要使用Date()而不是calander。

原因:Calander就像calandar一样工作,你的实例指向一个不会发生变化的calander(就像物理的一样)。

但是Date()是动态的,如下所示

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
       //get current date time with Date()
       Date date = new Date();
       System.out.println(dateFormat.format(date));

<强>更新 回应评论“因为问题是嵌入式系统特有的”

请参阅This Answer