2020 年的第一天,程序员鸭血粉丝又碰上生产事故

简介: hello~各位读者新年好,我是鸭血粉丝(大家可以称呼我为「阿粉」),一位喜欢吃鸭血粉丝的程序员!2019 年,阿粉写了很多 bug,这不前一段时间 OOM 差点就把服务器搞挂。跨年的时刻,阿粉默默立下一个 flag,2020 年再见 bug。

事件回顾

新年第一天,运营反馈商户收到对账文件有问题。刚接到电话时,阿粉是一万个不相信,这个代码都跑了这么久,怎么就偏偏今天不对了。可能看到阿粉不信,运营小姐姐随即发了一张商户给的账单截图。7.jpg

waht???2020 年才刚来,时间怎么变成 20201231 了。。。8.jpg

哎,阿粉只好先让运营稳住商户,然后赶紧起来,打开了电脑,首先定位一下问题。

问题排查

生成账单伪代码如下:

9.jpg

上面代码逻辑其实非常简单,将账单数据从数据库取出,然后按照按照相应的格式组装数组,写入文件。

阿粉走查了几遍代码,越看越觉得没问题啊,这么简单的问题没可能出现问题呀。没办法,只好请教一下阿粉的好朋友兼同事小黑。

很快小黑就给阿粉指出 YYYY/MM/dd HH:mm格式不对,需要使用 yyyy/MM/dd HH:mm。阿粉修改之后,重新生成对账单,解决这个问题。

原因分析

虽然解决了问题,但是阿粉其实还是一知半解,所幸元旦也没什么事,阿粉就深入研究一下 YYYY 格式。原来 JavaYYYYyyyy 分别代表两种不同格式。

10.jpg

Y 代表 Week Year,表示当天周所在的年份。这种方式将会把一年划分成52 周/53周(类似于闰年的概念,每隔几年将会增加一周)。Week Year下每周仅属于某一年,如果某年的第一周或最后一周跨年,就会导致部分日期年份与实际不符。

Week Year 存在两种标准:

  • ISO 8601:国际标准,每周从周一开始,每年的第一周至少包含 4 天
  • Common:通用标准,每周从周日开始,每年的第一周至少包含 1 天

Calendar 对象可以通过 setFirstDayOfWeek 与 setMinimalDaysInFirstWeek 改变上面默认标准

Java 将会根据系统环境变量决定使用哪种标准,可以通过设置 Locale 改变方式。代码如下:

// 选择 20191229 这一天
Date date20191229 = DateUtils.parseDate("20191229", "yyyyMMdd");
// 将会输出 2020,使用 Common 。当前系统,Locale 默认值为 Locale.CHINA
System.out.println(DateFormatUtils.format(date20191229,"YYYY"));
// 将会输出 2019,使用 ISO 8601
System.out.println(DateFormatUtils.format(date20191229,"YYYY", Locale.FRANCE));

下面例子我们使用 ISO 8601 标准,分别看一下最后一周跨年以及第一周跨年的例子。

2015 年最后一周跨年,2016 前三天使用 YYYY 最后结果为 2015,时间看起来被回退了。

11.jpg

2020 年第一周跨年,2019 年最后两天使用 YYYY 结果为 2020。

12.jpg


其他分析

终于弄明白 YYYY ,阿粉顺便也学习一下常用的日期格式。

下面以 2019-12-31 06:06:06:666 时间为例

Letter 含义 Example
Y Week Year YYYY---->2020
y yyyy------>2019
M MM------->12
m mm-------->06
D 一年中天数 DD-------->365
d 一月中的天数 dd--------->06
H 小时(0-23) HH--------->06
h 小时(1-12) hh---------->06
S 毫秒 SSS--------->666

技术总结

下面开始本篇文章的技术总结:

  • 第一,切记 YYYYyyyy区别,年份最好统一使用 yyyy
  • 第二,怕忘记的小伙伴可以安装一下阿里的 Alibaba Java Coding Guidelines 插件,这个插件可以检测出使用 YYYY 的代码
  • 第三,阅读完整文档,消除 Bug 最好的的办法就是阅读完整的文档,奥利给
  • 第四,测试环节增加边界测试,早发现,早消灭

随便聊聊

写这篇的文章时候,发现社区有些小伙伴也踩到这个坑,哈哈,吾道不孤也。

2021,2022....阿粉相信还会有新的小伙伴将会踩到这个坑,哈哈。在这里,阿粉给未来小伙伴留个言:

未来的的小伙伴你好,当你搜索到这篇文章并且看到这里,我知道你也踩到坑了,哈哈!既然都看到这里了,别忘记点个赞哦!

13.jpg

帮助

  1. week_year
  2. Serious Security: The decade-ending “Y2K bug” that wasn’t
  3. ISO week date_wiki
  4. Difference between year-of-era and week-based-year?
相关文章
|
10月前
|
JavaScript 小程序 Shell
🤒如果老板搞代码量统计,打工人如何自救?
“一个下午做出一个微信小程序”,“一个下午搞定业务方案”,每天写1000行代码的成绩,大家你们真的做得到吗?
188 0
🤒如果老板搞代码量统计,打工人如何自救?
|
网络协议 JavaScript 前端开发
面试周连续剧之奇葩遭遇
接着上一篇文章继续聊面试经历,通过前三天的面试经历,梳理总结一下,虽然拿到了三个offer,但是约过的面试还要继续,这是自己的原则,不能随便放别人鸽子,要有面试节操。在分享今天的面试经历的同时,顺便总结一下这几天面试遇到的各种奇葩遭遇,没有别的意思,只是单纯的分享一下,那么马上开启面试周的第四天吧。
98 1
面试周连续剧之奇葩遭遇
|
Web App开发 自然语言处理 安全
TikTok 美国员工抱怨工作压力大;多省集中排查整治超时加班;黑客向上海市民卖抢菜软件被抓;苹果员工对回办公室工作感到不满
本周架构视点:TikTok 美国员工抱怨工作压力大:需周末加班,跨时区工作;谷歌调整绩效评价体系:降低评估频率,属于变相加薪;多个省份集中排查整治超时加班问题,互联网企业等被重点检查;向日葵远程控制回应服务器崩溃;GitHub 要求所有贡献代码的用户在 2023 年底前启用双因素认证;WhatsApp 前高管:后悔当年把公司卖给 Facebook。
196 0
|
达摩院
【非广告】半年时间 90% 的收益就问你慌不慌
先说明这篇文章不包含任何广告内容,也不提供任何投资理财建议,股市有风险,投资需谨慎! 都说牛市来了,今年的 A 股的行情确实很不错,从上面的截图中可以看到阿粉的一只基金已经收益 90% 了。90% 是什么概念,反正阿粉是没有过的,估计很多人都没有经历过这种收益,所以这几天阿粉慌的一批,除了慌的很之外,另一个就是懊悔的很,当初应该多买点的,只能说人性是贪婪的。
【非广告】半年时间 90% 的收益就问你慌不慌
|
算法 NoSQL 安全
血的教训 ,一次订单号重复的事故我差点被开除
曾经有个项目,我们线上出了一次事故,这个事故的表象大体是这样的: 系统出现了两个一模一样的订单号,订单的内容却不是一样的,而且事情发生的不止一次,被老板发现之后,当月绩效被扣光!
血的教训 ,一次订单号重复的事故我差点被开除
|
算法 Java
一个多月的时间,终于把这件事做完了!
一个多月的时间,终于把这件事做完了!
100 0
一个多月的时间,终于把这件事做完了!
|
算法 Linux 数据库
12月13日云栖精选夜读 | 干货 :5个提醒,让你远离“数据呆”
随着数据积累得越来越多,数据获取成本不断降低,人们开始走向另一个危险的极端,那就是任何事情都要看数据,任何决定都去依赖数据。这种风气培养出了越来越多的“数据呆”。作为一个数据分析师,我是非常反对“唯数据论”的。
2242 0
|
Java 程序员 应用服务中间件
阿里员工吐槽:工作压力真的大,年假都没心情用,后悔来阿里
阿里巴巴是当下国内最顶尖的互联网公司之一,经过19年的发展,如今的阿里已经从单纯的电子商务公司过渡到了综合型的超级巨头。如今阿里旗下的阿里云已经成为了国内第一,世界第三的云计算公司。
4136 0
|
程序员
程序员离职带走源码竟获利800万,网友:我一般都是删库跑路
程序员辞职带走自己写的源码算违法吗? 程序员属于特殊职业,正常来说,公司会与程序员签订保密或所有权协议的。如果没有签订,按照法理来推论,在工作期间所有制作或参与的代码都属于公司财产,属于工作内容范围内的职责,未经公司许可带走或拷贝是违法的,这种行为可有公司自诉也可由司法部分公诉,具体要看给公司造成的损害程度。
1559 0
|
程序员
如何看待又一位深圳 24 岁程序员倒在工位上?是否程序员下班晚、加班多成了常态?
这是职业的焦虑还是环境如此? 如何避免过度加班带来的身体损伤? 8月25日下午,深圳红孩儿信息技术有限公司的程序员程某倒在了自己的岗位上。据同事反应,他当天的脸色不是很好,当时正在写代码,起身倒水时晕倒在地不省人事。
1210 0