首页 > 解决方案 > 设置日期为 30/12 或 31/12 时的 Java 日历错误

问题描述

我使用类Calendar来创建Date. 但是在我的测试用例中,当我设置日期为 31/12 或 30/12 时,我的日期年份是我设置的日期年份 + 1。示例 2018-12-29 -> 2018-12-29 但 2018-12-30 -> 2019 年 12 月 30 日。我不知道为什么?我的代码:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class MyClass {
    public static void main(String args[]) {
        calendarBug(2018, 11, 29);
        calendarBug(2018, 11, 30);
    }

    public static void calendarBug(int year, int month, int day) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH, month);
        calendar.set(Calendar.DAY_OF_MONTH, day);
        Date date = calendar.getTime();
        System.out.println(new SimpleDateFormat("YYYY-MM-dd").format(date));
    }
}

输出:

2018-12-29
2019-12-30

标签: javadate

解决方案


YYYY代表周年。改为使用yyyy

来自 javadocs:

一周年与 WEEK_OF_YEAR 周期同步。第一周和最后一周(含)之间的所有周都具有相同的周年值。因此,一周年的第一天和最后一天可能具有不同的日历年值。

例如,1998 年 1 月 1 日是星期四。如果 getFirstDayOfWeek() 为 MONDAY 且 getMinimalDaysInFirstWeek() 为 4(ISO 8601 标准兼容设置),则 1998 年的第 1 周开始于 1997 年 12 月 29 日,结束于 1998 年 1 月 4 日。最后三天的周年份为 1998 年1997 日历年。但是,如果 getFirstDayOfWeek() 是 SUNDAY,则 1998 年的第 1 周从 1998 年 1 月 4 日开始,到 1998 年 1 月 10 日结束;1998 年的前三天是 1997 年第 53 周的一部分,他们的周年是 1997 年。


推荐阅读