java - 设置日期为 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
解决方案
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 年。
推荐阅读
- vue.js - 如何根据vue js表中的行和列标题分配单元格值
- r - 使用 sparklyr::spark_read_json 时添加文件名
- c++11 - 查找存储在此字符串中的值
- crystal-lang - 如何将 YAML 文件读入哈希
- c# - 如何在 CosmosDB 查询中使用缓存
- python - 使用 API Telegram 被 python 脚本禁止
- swift - Swift 编译错误:不符合协议
- angular - Observable 类型的 Angular @Input
- spring-boot - Spring-Boot 启动器测试导入未解决
- javascript - Puppeteer 中的 QuerySelector 找不到元素(返回 null)