为何如此不一致?
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 .. .