代码如下
@Test
public void dateTest() {
// 指定了两个时区
// 通过指定具体的 年月日时分秒 构建 一个 LocalDateTime 对象(无时区), 绑定 到 北京时区,转为 实例,构建Date 对象
test(Date.from(LocalDateTime.of(2020,12,27,12,1,35).atZone(ZoneId.of("Asia/Shanghai")).toInstant()));
test(Date.from(LocalDateTime.of(2020,12,26,12,1,35).atZone(ZoneId.of("Asia/Shanghai")).toInstant()));
}
private void test(Date date) {
String loY = "yyyy-MM-dd HH:mm:ss";
String upY = "YYYY-MM-dd HH:mm:ss";
SimpleDateFormat loF = new SimpleDateFormat(loY);
SimpleDateFormat upF = new SimpleDateFormat(upY);
System.out.println("小Y格式化:" + loF.format(date));
System.out.println("大Y格式化:" + upF.format(date));
System.out.println("===========================");
}
代码运行结果
小Y格式化:2020-12-27 12:01:35
大Y格式化:2021-12-27 12:01:35
===========================
小Y格式化:2020-12-26 12:01:35
大Y格式化:2020-12-26 12:01:35
===========================
结果分析
发现当日期为 2020-12-27 时,两个 SimpleDateFormat 对象的转换的出来年份不一样,原因时一个的样式使用的 年份的 标识不同 “YYYY” 和 “yyyy”
具体原因时,”Y”是表示周年,表示:当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年
对于周年的具体解释:
参考:GregorianCalendar#getWeekYear() 这个方法上的注释
返回此公历所代表的周年。从“1”到“最大周数”之间的周中的日期具有相同的“周年”值,可以是“年(日历年)”值的前一年,也可以是“年(日历年)”值的后一年。
此方法在计算周年之前调用
就是说对于年份的区分,是把一年的天数,分成多少周(能整除的天数,就算这个周年表示的年份和当前的公历年份相同),后面多余不满一周当年的多余天数的就表示是下一个周年(就是当前公历年份的下一年)
SimpleDateFormat 类上的注释中的一些说明
Letter
Date or Time Component
Presentation
Examples
G
Era designator
AD
y
Year
1996; 96
Y
Week year
2009; 09
M
Month in year (context sensitive)
July; Jul; 07
L
Month in year (standalone form)
July; Jul; 07
w
Week in year
27
W
Week in month
2
D
Day in year
189
d
Day in month
10
F
Day of week in month
2
E
Day name in week
Tuesday; Tue
u
Day number of week (1 = Monday, …, 7 = Sunday)
1
a
Am/pm marker
PM
H
Hour in day (0-23)
0
k
Hour in day (1-24)
24
K
Hour in am/pm (0-11)
0
h
Hour in am/pm (1-12)
12
m
Minute in hour
30
s
Second in minute
55
S
Millisecond
978
z
Time zone
Pacific Standard Time; PST; GMT-08:00
X
Time zone
-08; -0800; -08:00