2017-06-20 60 views
-1

我有问题,当我尝试重置日历,因为它不恢复原始日期。 我在做什么错?试图重置日历在Java

public static void main(String[] args) { 
    Calendar from = Calendar.getInstance(); 
    int contador = 0; 
    while (contador < 30) { 
     Calendar cal = from; 
     for (int i = 0; i < 3; i++) { 
     cal.add(Calendar.DAY_OF_YEAR, +1); 
     System.out.println("Dia: " + String.valueOf(cal.get(Calendar.YEAR) + "/" + (cal.get(Calendar.MONTH) + 1) + "/" + cal.get(Calendar.DAY_OF_MONTH))); 
     } 
     contador++; 
    } 
} 

这就是结果:

Dia: 2017/6/21 
Dia: 2017/6/22 
Dia: 2017/6/23 
Dia: 2017/6/24 
Dia: 2017/6/25 
Dia: 2017/6/26 
Dia: 2017/6/27 
Dia: 2017/6/28 
Dia: 2017/6/29 
Dia: 2017/6/30 
...... 
+0

它不真的有任何问题与你的问题,但这些日子,你不应该使用过时的'日历'类。喜欢现代的LocalDate。与更多的程序员友好合作更好。它也会让你的代码更简单一些。它也将消除你的问题,因为你每次添加一天都需要创建一个新对象。 –

+1

您认为您重设日历的位置? – Tom

回答

2

因为你没有做的Calendar from一个副本Calendar cal = from。所以当你更新cal时,你也更新from,因为这两个是相同的实例。

每次需要新的Calendar时,请致电Calendar.getInstance()

Calendar cal = Calendar.getInstace(); 

由于奥莱V.V在评论中说,你能如果这个代码运行只是midnigh之前,你可以得到一个Calendar.getInstance()不同的“日期”值有一个奇怪的行为。这就是为什么这个解决方案有些风险。

为了防止这种情况,您可以使用clone()实例,Calendar实现Cloneable。这将确保您使用完全相同的日期和时间。因为这将重新创建一个具有确切参数的新实例。

Calendar cal = (Calendar) from.clone(); 
+0

如果您在午夜运行代码,每次只需获取一个新的'Calendar'实例就可以获得令人惊讶的结果。 –

+1

@ OleV.V。这就是为什么我继续使用'cloneable'接口来保证使用同一时间,我应该解释为什么;)(我有这个错误一次,我现在永远不会忘记) – AxelH

+0

你没有解释(也许我想要使其更清晰一点,也许我的评论是多余的)。感谢报告你有这个错误,我相信我们都可以从中学习。 –

1

The answer by AxelH是正确的。我发布这个答案,向你展示使用现代类LocalDate为你的目的。由于API设计更好,它更容易并自动消除您的问题;但主要是因为现代课程通常更适合工作,对程序员更友好,所以没有人应该使用长期过时的Calendar类恕我直言。

private static DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuu/M/d"); 

public static void main(String[] args) { 
    // give explicit time zone 
    LocalDate from = LocalDate.now(ZoneId.systemDefault()); 
    int contador = 0; 
    while (contador < 30) { 
     LocalDate cal = from; 
     for (int i = 0; i < 3; i++) { 
      cal = cal.plusDays(1); 
      System.out.println("Dia: " + cal.format(dateFormatter)); 
     } 
     contador++; 
    } 
} 

输出变为:

Dia: 2017/6/21 
Dia: 2017/6/22 
Dia: 2017/6/23 
Dia: 2017/6/21 
Dia: 2017/6/22 
Dia: 2017/6/23 
Dia: 2017/6/21 
Dia: 2017/6/22 
Dia: 2017/6/23 
Dia: 2017/6/21 
… 

没有如果使用旧的或新的课,我建议你给如图声明的时区的事情,要清楚的是,得到今天的读者日期是一个时区相关操作。

如果你可以用连字符,而不是在输出斜线生活,你可能会降低使用dateFormatter,只是打印这样的:

  System.out.println("Dia: " + cal); 

输出:

Dia: 2017-06-21 
Dia: 2017-06-22 
…