目录
一、问题代码
注意:今天码代码时间是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