又雙叒有兄弟因?yàn)?YYYY-MM-dd 被叫去加班了...
今天上海降溫到零下了,一點(diǎn)起床的欲望都沒(méi),想著直接睡到吃午飯吧。結(jié)果看到群里小伙伴吐槽一早被叫起來(lái)修Bug,定睛一看,要修的BUG居然又是之前說(shuō)過(guò)很多次的YYYY-MM-dd問(wèn)題,這個(gè)不是之前已經(jīng)說(shuō)過(guò)很多次了嗎(https://blog.didispace.com/YYYY-MM-dd-2020-again/),怎么還有人中招呢
不過(guò)再想想,其實(shí)也正常,每一年都有新人,即使是老人,也可能因?yàn)樘劢邮忠呀?jīng)存在問(wèn)題的系統(tǒng),當(dāng)然也可能沒(méi)關(guān)注DD,沒(méi)看過(guò)之前的推送
?不管什么原因,也許現(xiàn)在還有其他小伙伴正在修Bug的路上,所以,趕緊起床推一篇,聊聊這個(gè)問(wèn)題吧。
如果你正好碰到的,可以看看了解下原因,做好相應(yīng)的處理;如果還沒(méi)碰到的,最好也自查一下。如果你已經(jīng)很了解這個(gè),那么把這篇文章分享到朋友圈,也提醒下身邊其他的同行朋友們吧,也許會(huì)炸出幾個(gè)正在修Bug路上的兄弟 
事故現(xiàn)場(chǎng)
我們先來(lái)寫個(gè)單元測(cè)試,重現(xiàn)一下這個(gè)問(wèn)題。
測(cè)試邏輯:
1、創(chuàng)建兩個(gè)日期格式化: 一個(gè)是存在問(wèn)題的YYYY-MM-dd 另一個(gè)是正確用法yyyy-MM-dd 2、分別去格式化兩個(gè)不同的日期:2021年12月25日(周六),2020年12月26日(周日)
具體代碼如下:
public class Tests {
@Test
public void test() throws Exception {
SimpleDateFormat df1 = new SimpleDateFormat("YYYY-MM-dd");
SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, 2021);
c.set(Calendar.MONTH, 11);
// 2021年12月25日周六
c.set(Calendar.DATE, 25);
System.out.println("YYYY-MM-dd = " + df1.format(c.getTime()));
System.out.println("yyyy-MM-dd = " + df2.format(c.getTime()));
// 分割線
System.out.println("========================");
// 2021年12月26日 周日
c.set(Calendar.DATE, 26);
System.out.println("YYYY-MM-dd = " + df1.format(c.getTime()));
System.out.println("yyyy-MM-dd = " + df2.format(c.getTime()));
}
}
跑一下測(cè)試,可以看到輸出結(jié)果如下:
YYYY-MM-dd = 2021-12-25
yyyy-MM-dd = 2021-12-25
========================
YYYY-MM-dd = 2022-12-26
yyyy-MM-dd = 2021-12-262021年12月25日(周六),兩種格式化都正確 2021年12月26日(周日),YYYY-MM-dd出了問(wèn)題,年份到了2022年
問(wèn)題原因
為什么YYYY-MM-dd格式化2021年12月26日的時(shí)候,會(huì)到2022年呢?
因?yàn)閅YYY是week-based-year,表示:當(dāng)天所在的周屬于的年份,一周從周日開(kāi)始,周六結(jié)束,只要本周跨年,那么這周就算入下一年。
所以2021年12月26日那天在這種表述方式下就已經(jīng)到 2022年了。
而當(dāng)使用yyyy的時(shí)候,就還是 2021 年。
好了,最后把這篇文章分享到朋友圈,提醒下身邊其他的小伙伴吧,看看能炸出幾個(gè)今天再修Bug路上的兄弟 
最后的最后,平時(shí)喜歡討論技術(shù)的小伙伴也可以加入我們的高質(zhì)量技術(shù)交流群,與優(yōu)秀的人在一起,自己也會(huì)優(yōu)秀起來(lái),點(diǎn)擊加入
往期推薦
了解行業(yè)熱點(diǎn)、探索技術(shù)前沿
技術(shù)人的彎道超車從關(guān)注程序猿DD開(kāi)始
