Java Calendar get()方法不起作用

时间:2016-10-11 04:51:25

标签: java android calendar

我构建了一个Android日历示例,但是当我使用它时,我很奇怪。

我试图在本周一到达周一。但是,在此代码中

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DATE, day);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
int start = calendar.get(Calendar.DAY_OF_MONTH);

我无法获得正确的活动。一个症状是我可以在本周一的星期一得到 但上周也给了我这个星期一,所以我尝试了另一个代码

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DATE, day);
int start = calendar.get(Calendar.DATE);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
start = calendar.get(Calendar.DATE);

然后我可以得到我想要的正确活动。

但是我不知道为什么它在这两个代码之间起作用和区别。

感谢阅读和帮助!

1 个答案:

答案 0 :(得分:0)

首先是importan信息,日历有两种解释日历字段的模式,lenient和non-lenient。

当日历处于宽松模式时,它接受比它产生的更广泛的日历字段值。当日历重新计算get()返回的日历字段值时,所有日历字段都会进行规范化。例如,宽松的GregorianCalendar将MONTH == JANUARY,DAY_OF_MONTH == 32解释为2月1日。

当日历处于非宽松模式时,如果日历字段中存在任何不一致,则会引发异常。例如,GregorianCalendar总是生成介于1和月长之间的DAY_OF_MONTH值。如果已设置任何超出范围的字段值,则非宽松的GregorianCalendar在计算其时间或日历字段值时会抛出异常。

另一个重要的信息,日历集方法只设置字段值,但不会更新时间并计算每个字段(如年,月,日等),直到您使用任何get方法。

当Calendar以宽松模式运行时,这里是代码:

Calendar calendar = Calendar.getInstance();
calendar.setLenient(true);
calendar.set(Calendar.DATE, 1);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));

代码运行结果为10。 调用两组后,开始调用Calendar.DAY_OF_MONTH,现在日历开始更新时间,MONDAY的日期1和DAY_OF_WEEK混淆,但日历处于宽松模式,最终计算日期2016-10-10,所以得到的结果是10

非宽松模式下的相同代码:

Calendar calendar = Calendar.getInstance();
calendar.setLenient(false);
calendar.set(Calendar.DATE, 1);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));

抛出java.lang.IllegalArgumentException:DAY_OF_MONTH异常。

最后一段代码:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DATE, 1);
int start = calendar.get(Calendar.DATE);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
start = calendar.get(Calendar.DATE);

代码运行结果为26。 当第一次调用get Calendar.DATE时,此调用将更新时间并计算每个字段。计算日期是2016-10-01。然后调用集(Calendar.DAY_OF_WEEK,Calendar.MONDAY),此调用get方法后,计算日期为2016-09-26,结果为26。