如果年底的兄弟,正好写代码遇到了这个问题,那就停一下脚,看一眼吧。
下面开始介绍,直接上demo
首先
1.创建两个日期格式化
2.分别去格式化两个不同的日期:2021年12月25日(周六),2020年12月26日(周日)
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class demo01 {
public static void main(String[] args) {
SimpleDateFormat df1 = new SimpleDateFormat("YYYY-MM-dd");
SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR,2021);
c.set(Calendar.MONTH,11);
c.set(Calendar.DATE,25);
System.out.println("YYYY-MM-dd = " + df1.format(c.getTime()));
System.out.println("yyyy-MM-dd = " + df2.format(c.getTime()));
System.out.println("========================");
c.set(Calendar.DATE, 26);
System.out.println("YYYY-MM-dd = " + df1.format(c.getTime()));
System.out.println("yyyy-MM-dd = " + df2.format(c.getTime()));
}
}
然后
跑一下demo,出来结果如下:
YYYY-MM-dd = 2021-12-25
yyyy-MM-dd = 2021-12-25
========================
YYYY-MM-dd = 2022-12-26
yyyy-MM-dd = 2021-12-26
-
2021年12月25日(周六),两种格式化都正确
-
2021年12月26日(周日),YYYY-MM-dd出了问题,年份到了2022年
这就是为啥子,到年底这几天,兄弟们加班改bug的原因。
因为YYYY是week-based-year,表示:当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年。
所以,在一般没啥特殊业务场景处理下,兄弟们还是使用yyyy-MM-dd格式吧。
最后,再补充一个狗都知道的知识点,要是你不知道,就当我没说。
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR,2021);
c.set(Calendar.MONTH,11);
c.set(Calendar.DATE,25);
控制台:
YYYY-MM-dd = 2021-12-25
yyyy-MM-dd = 2021-12-25
为什么我这里set的月份是11,而控制台打印出来的确实12月嘞,这个当时我也是没百度出来,估计是我语言没组织好,百度听不懂我说的话,问了一嘴群里的兄弟,就有答案了呢。
然后就去看了一眼Calendar类的底层,发现一句注释是这样说的,
/**
* Field number for <code>get</code> and <code>set</code> indicating the
* month. This is a calendar-specific value. The first month of
* the year in the Gregorian and Julian calendars is
* <code>JANUARY</code> which is 0; the last depends on the number
* of months in a year.
*/
意思就是,
*字段号get和set表示
*月。这是一个特定于日历的值。第一个月
*公历和儒略历的年份是
* 一月是0;最后一个取决于数量一年中的几个月。
下面哥们儿来总结一下,MONTH加1的原因:
public statci final int MONTH 指示月份的 get 和 set 的字段数字。这是一个特定于日历的值。在格
里高利历和罗马儒略历中一年中的第一个月是JANUARY,它为0;最后一个月取决去一年中的月
份数。简单来说,因为这个值的初始值是0,因此我们要用它来表示正确的月份就需要加1。
好了,分享给你那傻兄弟吧,别让他走你走过的路了。