日期算错了:关于YYYY-MM-DD和yyyy-MM-dd

本文探讨了在Java中使用SimpleDateFormat解析'YYYY-MM-dd'和'yyyy-MM-dd'时的日期问题,特别关注ISOweeknumberingsystem与GregorianCalendar的区别,并通过示例展示了不同日期设置如何影响输出结果。
摘要由CSDN通过智能技术生成

目录

一、问题代码

二、问题复现

三、参考文献


一、问题代码

注意:今天码代码时间是2021年12月26日 星期日

直接上代码:

SimpleDateFormat sf1 = new SimpleDateFormat("YYYY-MM-dd");
SimpleDateFormat sf2 = new SimpleDateFormat("yyyy-MM-dd");
Calendar c1 = Calendar.getInstance();
System.out.println("YYYY-MM-dd:" + sf1.format(c1.getTime()));
System.out.println("yyyy-MM-dd:" + sf2.format(c1.getTime()));

输出结果:

 解释:

“YYYY format” 是 “ISO week numbering system”
“yyyy format” 是 “Gregorian Calendar”
“YYYY specifies the week of the year (ISO) while yyyy specifies the calendar year (Gregorian)"

什么意思呢?

“ISO week numbering system”意思是:基于周的计算系统,YYYY表示当天所在周的年份,因为今天是2021年12月26日 周日 是下一周的第一天,下一周属于2022年的第一周,所以YYYY为2022年

“Gregorian Calendar”的意思是公历(百度翻译)

二、问题复现

同样的现象:2020年12月27日 星期日

SimpleDateFormat sf1 = new SimpleDateFormat("YYYY-MM-dd");
SimpleDateFormat sf2 = new SimpleDateFormat("yyyy-MM-dd");
Calendar c1 = Calendar.getInstance();
c1.set(Calendar.YEAR,2020); //2020年
c1.set(Calendar.MONTH,11);  //12月
c1.set(Calendar.DATE,26);   //26日
System.out.println("YYYY-MM-dd:" + sf1.format(c1.getTime()));
System.out.println("yyyy-MM-dd:" + sf2.format(c1.getTime()));
System.out.println("==========");
c1.set(Calendar.DATE,27);   //27日
System.out.println("YYYY-MM-dd:" + sf1.format(c1.getTime()));
System.out.println("yyyy-MM-dd:" + sf2.format(c1.getTime()));

问:Calendar.MONTH为什么设置为11,表示12月?

答:在格里高利历和罗马儒略历中一年中的第一个月是JANUARY,它为0;最后一个月取决于一年中的月份数。所以这个值的初始值为0,所以我们用它来表示日历月份时需要加1。

三、参考文献

1、关于日期格式yyyy-MM-dd和YYYY-MM-dd
https://blog.csdn.net/aleefang/article/details/79094603

2、java的Calendar,获取月份少一月的问题及其它注意事项
https://www.cnblogs.com/chenjfblog/p/7699096.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值