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

本篇文章投稿给 Java 极客技术,欢迎各位小伙伴关注

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

3d4e423eae6086416754b8e4bec7f747

可是没想到还没过几个小时,刚立的 falg 就倒下了,阿粉太难了 😭。。。。

事件回顾

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

image-20200104101242237

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

img

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

问题排查

生成账单伪代码如下:

generate_bills

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

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

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

原因分析

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

image-20200104141950267

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,时间看起来被回退了。

image-20200104230306192

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

image-20200104230823838

其他分析

终于弄明白 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 一年中天数 MM-------->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....阿粉相信还会有新的小伙伴将会踩到这个坑,哈哈。在这里,阿粉给未来小伙伴留个言:

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

img

帮助

  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?
欢迎关注我的公众号:程序通事,获得日常干货推送。如果您对我的专题内容感兴趣,也可以关注我的博客:studyidea.cn

其他平台.png

Image placeholder
Tobess
未设置
  99人点赞

没有讨论,发表一下自己的看法吧

推荐文章
深夜生产事故,人工多线程来救场!

有一个读者问我:你认为一个程序员具备什么样的能力,才算得上是厉害的程序员?我答:拥有解决问题的能力的程序员。这个回答貌似有点抽象,不要紧看下面的文章你会慢慢有所了解。 一、解决问题的能力很多年前,当我

周末生产事故!一次心惊肉跳的服务器入侵排查….

近日接到客户求助,他们收到托管电信机房的信息,通知检测到他们的一台服务器有对外发送攻击流量的行为。希望我们能协助排查问题。 一、确认安全事件情况紧急,首先要确认安全事件的真实性。经过和服务器运维人员沟

Github一天标星1k+,程序员需要知道的那些定理和法则

大数据文摘出品编译:蒋宝尚、曹培信摩尔定律知道么?帕金森定律讲的又是啥?作为一名合格的开发人员,除了本身码力超强外,或多或少要知道几条“”潜规则”,例如依赖倒置原则、鲁棒性原则……关于开发人员必须要知

程序员 12 小时惊魂记:凌晨迁移数据出大事故!

有一个读者问我:你认为一个程序员具备什么样的能力,才算得上是厉害的程序员?我答:拥有解决问题的能力的程序员。这个回答貌似有点抽象,不要紧看下面的文章你会慢慢有所了解。 一、解决问题的能力很多年前,当我

@程序员,请万分珍重你的第一份工作

01、我的故事昨天我在群里发起了一个议题:读者朋友们,大家伙觉得第一份工作重要吗?回答不要太统一,重要个屁——不可能的。老读者都知道一些我的经历了。高考失利,因为太文弱干不了搬砖的活,就上了大专,大三

在中国,程序员是青春饭吗?

很遗憾,就我在中国和美国的工作经历和观察来看,程序员无论在哪里都是“青春饭”(注意引号,友军先别开枪!)。但是,在你站在“40岁50岁时候的自己”这个角度来思考问题,从而害怕程序员是青春饭,自己被年轻

5G来了,普通人看热闹,程序员看颠覆

前言:如果说4G带领人们来到移动互联网时代,5G则加速开启了万物互联的智能时代。从40年代信息技术革命到今天的5G,研发、生产、销售等都在被重塑。大数据、云计算、人工智能等技术不断创新,新的业态层出不

把 14 亿中国人都拉到一个微信群,程序员在技术上能实现吗?

根据国家统计局的数据,截至2017年末,中国大陆总人口为13亿9008万人(包括31个省、自治区、直辖市和中国人民解放军现役军人,不包括香港、澳门和台湾以及海外华侨人数),早已超过13亿。目前,微信群

我是程序员,每一天都太难了!

互联网圈子里有一个神奇的群体——程序员。他们每天穿着格子衫,背着双肩包挤地铁,一到公司就陷入了“打代码-喝水-上厕所-打代码-喝水-上厕所”的死循环。热(jia)爱(ban)工(yan)作(zhong

5位女性程序员的自白:计算机不撒谎;女程序员的代码一样也很棒

谁说这个领域就是男性的天下偏见本身就是一种带标签的想法她们的世界里只信奉“computer never lies”她们认为代码漂亮比发型漂亮更重要她们到底是谁?谷悦是喜欢简单、纯粹工作的气质女神,八年

解读2019华为第001号文件:AI时代软件开发的第一要义是可信

晓查发自凹非寺量子位出品|公众号QbitAIAI加持,万物互联、万物智能。我们在享受科技进步的同时,软件开发行业却面临着更大的挑战。过去,软件出现安全问题或许仅仅意味着经济损失,但当走向产业互联网时代

献给 Hello World!的建筑师 (写于版主第一天)

写在前面的话时长13周,终于坚持下来了。感觉这个过程就是一个几度想放弃,但又“真香”的过程,期待更多人坚持下来,加油!实习版主的历程当时为什么选择申请实习版主,老实说我是受上一任版主@Epona影响的

记一次JVM FullGC引发严重线上事故的定位、分析、解决过程!

这篇文章给大家聊一次线上生产系统事故的解决经历,其背后代表的是线上生产系统的JVMFullGC可能引发的严重故障。一、业务场景介绍先简单说说线上生产系统的一个背景,因为仅仅是文章作为案例来讲,所以弱化

如何减少或避免企业存储系统停机事故?

停机致使企业在一段时间内无法访问重要数据,可能造成数百万美元的损失,并导致声誉受损、业务损失和客户流失等严重后果。而企业想要从这样的打击中恢复过来是非常困难的,所以,减少或避免企业存储系统停机是非常重

企业出了IT事故,谁该来背锅?

当企业内部出现IT事故时,舆论质疑、客户追责甚至诉讼等问题都会接踵而至,这些问题会令企业蒙受巨大的损失。那么,谁应该为这样的失误负责呢?有些企业由于未能及时更新系统补丁而导致IT事故,企业的声誉和估值

波音737事故反思:该让数据“接管”生命控制权吗?

大数据文摘出品作者:林安安、蒋宝尚2018年10月29日,一架载有189名乘客和机组人员的印尼狮航波音737MAX8客机,在起飞13分钟后失联,随后被确认在西爪哇附近海域坠毁,机上人员全部遇难。截止到

DM8新品发布会:中国数据库四十年的回顾与展望

在希腊神话中,普罗米修斯为了人类播下了火种,促进了人类文明的进步。中国数据库的发展历程中,也有这么一批“播种者”,不断为数据库的延续发展而砥砺前行。在上世纪七八十年代,伴随着登月工程等大型项目而生的数

再见,2019!你好,2020!

今天,是2019年的最后一天。虽有不舍,但终归还是得说再见!明天又会翻开新一年的篇章,希望各位在新的一年都能升职加薪迎娶白富美,走上人生巅峰。19年某月某日突发奇想,想用公众号分享一下这些年学到的技术

送别2019,期待2020!

概述2019年时间过得很快。有欢笑、有离别、有压力、有收获。关于工作项目发生了变动,团队也发生了变动,不过总体是成长的,在这感谢领导的关照、信任!下半年开始学习Go语言,并用Go进行搭建项目,也算是刚

码龄超过20年,依然对生活和编程充满激情,这是三位70后“老”程序员的故事

大数据文摘出品作者:周素云、张秋玥加班996,生病ICU。这是一句最近搅乱了很多程序员平静生活,也让所有的“社畜”认真反思人生的话题。但是,让程序员们真正感到焦虑的其实并不只是工作的压力,更多的是对未

【分享】2020年大前端面试题库 - 备战明年金三银四

https://segmentfault.com/a/119000002122195...2020年大前端面试题库-备战明年金三银四前端面试 阅读约10分钟写在前面现在面试文章已很多,更不觉得新鲜,本

Udemy:人工智能是2020年职场最需要的技能之一

TensorFlow是过去三年中最受欢迎的技术技能,根据Udemy的数据在2016年至2019年之间呈指数增长。·除了Web开发框架,云计算和IT认证(包括AWS、CompTIA和Docker)之外,

Gartner:2020年十大战略技术趋势

技术变革的步伐正在迅速加快,IT专业人员需要研究的因素,他们以前从未处理过的事情(例如超级自动化、多重体验和人员扩充)都将对企业产生重大的影响。Gartner高级研究副总裁ValSribar说:“自从

2020年前必须掌握的数据库面试问题~

一、为什么用自增列作为主键1、如果我们定义了主键(PRIMARYKEY),那么InnoDB会选择主键作为聚集索引。如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索

调查:2020年企业IT预算研究报告

随着云计算、人工智能等技术应用的落地,企业越来越多地用新技术支出来应对新的业务需求,大多数企业都在主动或被动地加入数字化转型浪潮,这一点在IT预算中表现得最为明显。TechRepublic最近进行了一