java - 奇怪的 Java 日历不一致

标签 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));
}

输出:

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/

相关文章:

java - Hibernate注释@Query参数无法正常工作

java - 查找月份的最后一天并在 Android 应用程序中使用值更改监听器

java - 为什么日历值不同?

ios - 关于 requestAccessToEntityType,什么时候调用 applicationDidBecomeActive?

javascript - cal-heatmap - 如何根据 rect .q1{} 颜色更改文本颜色?

java - Java中如何限制Hangman的猜测次数

java - 解析和修改 xml 文件时保留现有的缩进、空格等

javascript - 使用 Google Closure 编译器和 Gradle 缩小 JavaScript

java - 使用Maven构建storm-starter

java - 使用 p :calendar (no validation) 相互限制开始和结束日期时间