为什么会这样不一致?
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));
}
输出:
KO current month: 2
OK current month: 1
最佳答案
今天是 5 月 31 日。 Calendar
对象默认为 lenient所以在第一个 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()));
返回
03/03/18 10:40
03/02/18 10:40
如果你想阻止你需要调用的行为setLenient()
方法
Calendar calendar = Calendar.getInstance();
calendar.setLenient(false);
calendar.set(Calendar.MONTH, 1);
这将导致以下 IllegalArgumentException
异常:
Exception in thread "main" java.lang.IllegalArgumentException: MONTH: 1 -> 2 at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:2829) at java.util.Calendar.updateTime(Calendar.java:3393) ...
关于java - 奇怪的 Java 日历不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50621049/