ITmob-Ly
发布于 2022-12-28 / 240 阅读
0

Java 或 Kotlin 使用 YYYY-MM-dd 日期格式化时的跨年问题(年份不正确)

1. 问题

在对日期进行格式化时出现了如图的结果,使用 YYYY-MM-dd 格式时年份错误。

@Composable
private fun DataView() {
    val format = SimpleDateFormat("YYYY-MM-dd")
    val format1 = SimpleDateFormat("yyyy-MM-dd")

    val calendar: Calendar = Calendar.getInstance()
    calendar.set(2023, Calendar.DECEMBER, 31)
    val date = calendar.time

    Text(text = format.format(date))
    Text(text = format1.format(date))
}

date format

2. 原因

使用 YYYY-MM-dd 格式化时结果为 2024-12-31,出现了跨年成下一年 2024 年了。

这是因为日期格式化时,YYYY 表示(week-based-year)基于周的年份,每周仅属于某一年。如果一个日期处在一个跨年的周时,就会出现这种问题。

一周存在跨年问题时,判断它是属于上一年还是下一年,可以参考文档:A week is defined by

A week is defined by:
    The first day-of-week. For example, the ISO-8601 standard considers Monday to be the first day-of-week.
    The minimal number of days in the first week. For example, the ISO-8601 standard counts the first week as needing at least 4 days.
Together these two values allow a year or month to be divided into weeks.

因为上面的原因,格式化日期时应该使用 yyyy-MM-dd (year-of-era) 。很多编程规范或手册也是这样要求的。