【问题标题】:Set method for Java Calendar only works if I do a print of itJava Calendar 的 Set 方法只有在我打印它时才有效
【发布时间】:2020-06-18 15:20:38
【问题描述】:

我遇到了一个我真的不明白的问题。我正在尝试在日历上使用 set 方法,但只有在我打印它时它才会修改值,这里是代码:

Calendar cal = Calendar.getInstance();
cal.set(2020,2,31);
// System.out.println("Necessary print: " + cal.getTime());

cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
// reset time
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);

System.out.println("Date set: " + cal.getTime());
System.out.println("Day of month: " + cal.get(Calendar.DAY_OF_MONTH));

前面的代码给了我输出:

Date set: Mon Mar 02 00:00:00 CET 2020
Day of month: 2

如果我取消注释“必要的打印”,那么我会得到:

Necessary print: Tue Mar 31 23:07:17 CEST 2020
Date set: Mon Mar 30 00:00:00 CEST 2020
Day of month: 30

我真的很想知道为什么打印会影响此方法,在此先感谢您的帮助! ????

【问题讨论】:

标签: java methods printing calendar java.util.calendar


【解决方案1】:

Calendar 类的documentation 声明:

可以使用三种方法更改日历字段:set()add()roll()set(f, value) 将日历字段 f 更改为 value。此外,它设置了一个内部成员变量来指示日历字段f 已更改。尽管日历字段f 立即更改,但在下一次调用get()getTime()getTimeInMillis()add()roll() 之前,不会重新计算日历的time 值(以毫秒为单位)。因此,多次调用set() 不会触发多次不必要的计算。由于使用set() 更改日历字段,其他日历字段也可能更改,具体取决于日历字段、日历字段值和日历系统。此外,get(f) 不一定会在重新计算日历字段后返回调用 set 方法设置的值。具体由具体的日历类决定。

TL;DR:您需要调用 cal.getTime() 来更新值。

【讨论】:

    猜你喜欢
    • 2020-03-02
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多