常用的YYYY-MM-dd時間格式化會引發跨年bug

昨天在v站上看到這個關於YYYY-MM-dd的使用而出現Bug的帖子(v2ex.com/t/633650)非常有意思,所以拿過來分享一下。

在任何編程語言中,對於時間、數字等數據上,都存在很多類似這種平時一切OK,特定時間、特定環境出問題的情況。出現這種問題的根本原因還是我們對於各種數據結構的細節定義在開始的時候都不太注意,都是從每一次使用問題出現之後才開始有了“刻骨銘心”的認識。

不論昨天你是否也經歷了這樣的Bug,還是沒有經歷的讀者,希望看到這篇文章之後,對這個細節可以上點心,避免日後因為這個細節而犯錯。

下面就來一起看看這個問題的表現和原因吧:

問題表現

常用的YYYY-MM-dd時間格式化會引發跨年bug

BUG 的原因

YYYY是week-based-year,表示:當天所在的周屬於的年份,一週從週日開始,週六結束,只要本週跨年,那麼這周就算入下一年。所以2019年12月31日那天在這種表述方式下就已經 2020 年了。

而當使用yyyy的時候,就還是 2019 年。

相關說明

  • https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns
  • https://nakedsecurity.sophos.com/2019/12/23/serious-security-the-decade-ending-y2k-bug-that-wasnt/


分享到:


相關文章: