欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java时间转换,日期格式化使用 YYYY-MM-dd 的潜在问题

程序员文章站 2022-05-17 20:34:25
...

日期格式化使用 YYYY-MM-dd 的潜在问题

  • 测试逻辑:
    1. 创建两个日期格式化,一个是出问题的YYYY-MM-dd,另一个是正确用法yyyy-MM-dd
    2. 分别去格式化两个不同的日期:2020年12月26日(周六),2020年12月27日(周日)
  • 代码如下
@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 Text AD
y Year Year 1996; 96
Y Week year Year 2009; 09
M Month in year (context sensitive) Month July; Jul; 07
L Month in year (standalone form) Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day name in week Text Tuesday; Tue
u Day number of week (1 = Monday, ..., 7 = Sunday) Number 1
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800
X Time zone ISO 8601 time zone -08; -0800; -08:00