问题场景:
在许多项目的场景中,我们可能都需要生成时间,大家可能一般都会使用new Date() ,但是也会有人使用Calender类来生成,下面我们看一个案例,提醒大家使用Calender时一定要慎重,要不然就可能出现大错误。
问题描述:
现在我们有一个生成时间和转化时间的测试类,我们看看它的运行结果。
public class DateTest {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
calendar.set(2019,Calendar.AUGUST,31);
Date time = calendar.getTime();
DateFormat format_yy = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("2019-08-31 to yy-MM-dd: "+format_yy.format(time));
DateFormat format_YY = new SimpleDateFormat("YYYY-MM-dd");
System.out.println("2019-08-31 to YY-MM-dd: "+format_YY.format(time));
calendar.set(2019,Calendar.DECEMBER,31);
Date time_12 = calendar.getTime();
System.out.println("--------------");
System.out.println("2019-12-31 to yy-MM-dd: "+format_yy.format(time_12));
System.out.println("2019-12-31 to YY-MM-dd: "+format_YY.format(time_12));
}
}
运行结果如下:
2019-08-31 to yy-MM-dd: 2019-08-31
2019-08-31 to YY-MM-dd: 2019-08-31
--------------
2019-12-31 to yy-MM-dd: 2019-12-31
2019-12-31 to YY-MM-dd: 2020-12-31
大家可以直观的看到,日期转换格式我们使用了"yyyy-MM-dd"和"YYYY-MM-dd"两种不同的形式,可以看到输出的结果中,普通的日期是没有什么区别的,但是当输出12-31的时候,年份就发生了变化。
虽然这个是一个很小的细节,但是在开发中如果真正显示到页面上,用户看了也会一脸懵好吧,所以我们可以查阅资料解释下。
原因分析:
y:year-of-era;正正经经的年,即元旦过后;
Y:week-based-year;只要本周跨年,那么这周就算入下一年;
就比如说今2019-2020的12.31 这一周是跨年的一周,而 12.31 是周二,那使用 YYYY 的话会显示 2020,使用 yyyy 则会从 1.1 才开始算是 2020。
这个小的细节还是希望大家能够注意一下。