馬上2026年了,提前祝大家新年快樂!

我麼這些做項目的牛馬要關注下跨年的時間問題了

今天我們的一個客户還問我們,這馬上跨年日期切換了,我們系統會不會出現跨年的日期問題

為什麼會提這個呢?

因為在Java中對Date進行日期格式話的時候,不同的格式化格式會出現不同的結果,會出現Java 時間格式化陷阱

嚇得我趕緊寫了一個main方法測試一下

public static void main(String[] args) {
        LocalDate date = LocalDate.of(2025, 12, 30);
        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("YYYY-MM-dd");
        DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        System.out.println("大寫YYYY:" + date.format(formatter1));
        System.out.println("小寫yyyy:" + date.format(formatter2));
    }

 輸出結果:

大寫YYYY:2026-12-30
小寫yyyy:2025-12-30

發現確實不同的格式會出現不同的結果

為什麼呢?

因為 2025 年的最後幾天屬於 ISO 週年的 2026 年(因為 ISO 周從週一算起,跨年可能提前進入下一年的第 1 周)

其實查看寫的代碼會發現,IDEA也有相關的提示

跨年的Java 時間格式化陷阱問題_時間格式化

Uppercase 'YYYY' (week year) pattern is used: probably 'yyyy' (year) was intended

IDEA甚至還給瞭解決方案:Replace 'YYYY' with 'yyyy',將大寫Y替換為小寫y

 

説明:

YYYY 是 週年的年份(year of week-based year)

它基於 ISO 周曆法,即“週年”(week-based year),可能和公曆年不一致。

例如:如果某一年的元旦是星期六或星期天,那麼該周屬於前一年的第 53 周,導致 YYYY 可能為前一年或後一年。

yyyy 是 公曆年份(proleptic Gregorian year)

這是標準的年份,直接對應日曆上的年份


感覺自己的項目中有風險的也趕緊檢查下吧

我是全局搜索了下項目中是否用了 YYYY、YY、Y 等大寫 Y

任何出現 YYYY 的格式字符串都可能是隱患!