我尝试重置日历时遇到问题,因为它没有恢复原始日期。 我究竟做错了什么 ?
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 :(得分: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
…