0

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

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

2 回答 2

3

因为你不是在做Calendar fromwith的副本Calendar cal = from。因此,当您更新时cal,您也会更新,from因为这两个是同一个实例。

每次Calendar.getInstance()需要新的Calendar.

Calendar cal = Calendar.getInstace();

正如Ole VV在评论中所说,如果此代码在午夜之前运行,您可能会遇到奇怪的行为,您可以使用Calendar.getInstance(). 这就是为什么这种解决方案存在一定风险的原因。

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

Calendar cal = (Calendar) from.clone();
于 2017-06-20T08:42:30.163 回答
1

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
…
于 2017-06-20T09:04:36.607 回答