馬上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也有相關的提示
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 的格式字符串都可能是隱患!