奇怪的Java日历不一致

red*_*hka 4 java calendar

为何如此不一致?

public static void main(String[] args) {
    final Calendar calendar = Calendar.getInstance();

    calendar.set(Calendar.MONTH, 1);
    System.out.println("KO current month: " + calendar.get(Calendar.MONTH));

    calendar.set(Calendar.MONTH, 1);
    System.out.println("OK current month: " + calendar.get(Calendar.MONTH));
}
Run Code Online (Sandbox Code Playgroud)

输出:

KO current month: 2
OK current month: 1
Run Code Online (Sandbox Code Playgroud)

Kar*_*cki 11

今天是5月31日.该Calendar对象默认是宽松的,因此在第一个set()日期切换到2月31日之后不存在.Calendar通过搬到3月3日宽大地修复它.月2意味着三月.

第二项set()操作适用于3月3日,因此可以按照预期切换到2月3日.月1意味着二月.

您可以通过格式化完整日期来查看:

SimpleDateFormat sdf = new SimpleDateFormat();
Calendar calendar = Calendar.getInstance();

calendar.set(Calendar.MONTH, 1);
System.out.println(sdf.format(calendar.getTime()));

calendar.set(Calendar.MONTH, 1);
System.out.println(sdf.format(calendar.getTime()));
Run Code Online (Sandbox Code Playgroud)

返回

03/03/18 10:40
03/02/18 10:40
Run Code Online (Sandbox Code Playgroud)

如果要防止需要调用setLenient()方法的行为

Calendar calendar = Calendar.getInstance();
calendar.setLenient(false);
calendar.set(Calendar.MONTH, 1);
Run Code Online (Sandbox Code Playgroud)

这将导致以下IllegalArgumentException异常:

线程"main"java.lang.IllegalArgumentException中的异常:在java.util.Calendar.updateTime(Calendar.java:3393)java.util.GregorianCalendar.computeTime(GregorianCalendar.java:2829)中的MONTH:1 - > 2 .. .