2020 年的第一天,程序員鴨血粉絲又碰上生產事故

2019 年,小編寫了很多 bug,這不前一段時間 OOM 差點就把服務器搞掛。跨年的時刻,小編默默立下一個 flag,2020 年再見 bug。

可是沒想到還沒過幾個小時,剛立的 falg 就倒下了,太難了 :sob:。。。。

事件回顧

新年第一天,運營反饋商戶收到對賬文件有問題。剛接到電話時,我是一萬個不相信,這個代碼都跑了這么久,怎么就偏偏今天不對了。可能看到我不信,運營小姐姐隨即發了一張商戶給的賬單截圖。

waht???2020 年才剛來,時間怎么變成 20201231 了。。。

哎,只好先讓運營穩住商戶,然后趕緊起來,打開了電腦,首先定位一下問題。

問題排查

生成賬單偽代碼如下:

上面代碼邏輯其實非常簡單,將賬單數據從數據庫取出,然后按照按照相應的格式組裝數組,寫入文件。

查了幾遍代碼,越看越覺得沒問題啊,這么簡單的問題沒可能出現問題呀。沒辦法,只好請教一下好朋友兼同事小黑。

很快小黑就指出 YYYY/MM/dd HH:mm 格式不對,需要使用 yyyy/MM/dd HH:mm 。修改之后,重新生成對賬單,解決這個問題。

原因分析

雖然解決了問題,但是其實還是一知半解,所幸元旦也沒什么事,就深入研究一下 YYYY 格式。原來 Java 中 YYYY 與 yyyy 分別代表兩種不同格式。

Y 代表 Week Year ,表示當天周所在的年份。這種方式將會把一年劃分成 52 周/53 周(類似于閏年的概念,每隔幾年將會增加一周)。 Week Year 下每周僅屬于某一年,如果某年的第一周或最后一周跨年,就會導致部分日期年份與實際不符。

Week Year 存在兩種標準:

ISO 8601:國際標準,每周從?周一?開始,每年的第一周至少包含 4 天

Common:通用標準,每周從?周日?開始,每年的第一周至少包含 1 天

Calendar 對象可以通過 setFirstDayOfWeek 與 setMinimalDaysInFirstWeek 改變上面默認標準

Java 將會根據系統環境變量決定使用哪種標準,可以通過設置?Locale?改變方式。代碼如下:

// 選擇 20191229 這一天Datedate20191229 = DateUtils.parseDate("20191229","yyyyMMdd");// 將會輸出 2020,使用 Common 。當前系統,Locale 默認值為 Locale.CHINASystem.out.println(DateFormatUtils.format(date20191229,"YYYY"));// 將會輸出 2019,使用 ISO 8601System.out.println(DateFormatUtils.format(date20191229,"YYYY", Locale.FRANCE));

下面例子我們使用?ISO 8601?標準,分別看一下最后一周跨年以及第一周跨年的例子。

2015 年最后一周跨年,2016 前三天使用 YYYY 最后結果為 2015,時間看起來被回退了。

2020 年第一周跨年,2019 年最后兩天使用 YYYY 結果為 2020。

其他分析

終于弄明白 YYYY ,順便也學習一下常用的日期格式。

下面以 2019-12-31 06:06:06:666 時間為例

技術總結

下面開始本篇文章的技術總結:

第一,切記 YYYY 與 yyyy 區別,年份最好統一使用 yyyy

第二,怕忘記的小伙伴可以安裝一下阿里的?Alibaba Java Coding Guidelines插件,這個插件可以檢測出使用 YYYY 的代碼

第三,閱讀完整文檔,消除 Bug 最好的的辦法就是閱讀完整的文檔,奧利給

第四,測試環節增加邊界測試,早發現,早消滅

隨便聊聊

寫這篇的文章時候,發現社區有些小伙伴也踩到這個坑,哈哈,吾道不孤也。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內容

  • ?hello~各位讀者新年好,我是鴨血粉絲(大家可以稱呼我為「阿粉」),一位喜歡吃鴨血粉絲的程序員!2019 年,...
    碼哥說閱讀 325評論 0 3
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,486評論 0 13
  • SwiftDate概況 從Swift發布起,我們就沒有放棄使用Swift。 當然,我們希望在項目能夠輕松自如地管理...
    Mee_Leo閱讀 10,174評論 1 13
  • FreeMarker的模板文件并不比HTML頁面復雜多少,FreeMarker模板文件主要由如下4個部分組成: 1...
    年輕小伙程序員閱讀 3,031評論 0 5
  • (如果,時間可以停留,我希望停在遇到你的現在。世界那么大,能夠遇到你不容易) 喜歡暢想在唯美的世界中,那種感覺妙不...
    迷霧糾紛閱讀 411評論 4 3