尝试重置Java中的日历

时间:2017-06-20 08:40:53

标签: java java.util.calendar

我尝试重置日历时遇到问题,因为它没有恢复原始日期。 我究竟做错了什么 ?

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
...... 

2 个答案:

答案 0 :(得分:3)

因为您没有使用Calendar from复制Calendar cal = from。因此,当您更新cal时,您也会更新from,因为这两个是同一个实例。

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

Calendar cal = Calendar.getInstace();

正如 Ole V.V 在评论中所说,如果此代码在midnigh之前运行,您可能会遇到一种奇怪的行为,您可以使用Calendar.getInstance()获得不同的“日期”值。这就是为什么这种解决方案存在风险的原因。

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

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

答案 1 :(得分: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
…