使用YYYY-MM-dd格式化时间的问题记录

73 阅读2分钟

前言

在软件开发中,时间的处理和格式化是一个常见的任务。然而,当涉及到时间格式化时,有一种常见的格式化方式可能会引发问题:使用YYYY-MM-dd格式化时间。在本文中,我们将探讨这种格式化方式可能导致的问题以及如何避免它们。最近不幸被我遇到了,记录下吧

问题的根源

Java等编程语言中,Yy分别代表了不同的含义。其中,y表示真实年份,而Y表示年份所在的周属于的年份(白话:当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年)。这就意味着,如果在跨年的情况下使用YYYY进行格式化,可能会得到不正确的结果。

image.png

举个栗子

public static void main(String[] args) {
    System.out.println(new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(Date.from(LocalDateTime.of(2020,12,28,1,59,59).atZone(ZoneId.of("Asia/Shanghai")).toInstant())));
    System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date.from(LocalDateTime.of(2020,12,28,1,59,59).atZone(ZoneId.of("Asia/Shanghai")).toInstant())));
}

2021-12-28 01:59:59
2020-12-28 01:59:59

正确的做法

为了避免这种问题,我们应该使用小写的yyyy进行日期的格式化。这样可以确保我们得到的结果是正确的年份。正确的格式化方式是yyyy-MM-dd

总结

在日期格式化时,特别是涉及到年份的情况下,使用YYYY-MM-dd格式化时间可能会导致潜在的Bug。为了确保正确性,我们应该始终使用小写的yyyy进行年份的格式化,以避免因为格式化而引发的错误。正确的格式化方式有助于保证程序的稳定性和正确性。