我正在编写一个程序,其中包含显示当前时间的标题。我想允许用户修改日期/时间设置。但在用户修改后,我无法让日历保持最新状态。它始终显示用户输入的值。例如:
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。
答案 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)
Calendar
和Date
只是快照。创建后,它们不会自行更新。
无论您选择哪种方式,每次要更新显示时都必须创建一个新的。然后对新快照进行调整。
如果您希望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