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阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • ​hello~各位读者新年好,我是鸭血粉丝(大家可以称呼我为「阿粉」),一位喜欢吃鸭血粉丝的程序员!2019 年,...
    码哥说阅读 313评论 0 3
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,442评论 0 13
  • SwiftDate概况 从Swift发布起,我们就没有放弃使用Swift。 当然,我们希望在项目能够轻松自如地管理...
    Mee_Leo阅读 9,970评论 1 13
  • FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1...
    年轻小伙程序员阅读 2,937评论 0 5
  • (如果,时间可以停留,我希望停在遇到你的现在。世界那么大,能够遇到你不容易) 喜欢畅想在唯美的世界中,那种感觉妙不...
    迷雾纠纷阅读 400评论 4 3