Moment的feature导致线上bug解决分析


Posted in Javascript onSeptember 23, 2022

bug的出现

这一天,本来是平平淡淡的一天,我正准备一如既往的到点下班,结果qa说线上出了个匪夷所思的bug。

表象为:用户在日期选择器选择了1964-01-01之后,自动变成了1963-12-31

我心里想:这是什么神奇bug,于是我又尝试了一下选择1964-01-02、1963-12-31、1965-01-01、1963-01-01,结果都正常,那么到底是为什么会引发这个bug呢?

bug排查

由于后端把时间、日期类的字段都定义为了时间戳,因此前端是有进行一些处理的,可以看下面这个图

Moment的feature导致线上bug解决分析

从接口中拿到时间戳后,会先存到内存中,格式化后传入antd日期选择器中。每当用户选择日期之后,我会截取日期中的年月日,然后使用moment-timezone去获取到雅加达(印尼首都)当天零点的时间戳,存储到内存中,当用户点击提交的时候,这个时间戳就会被提交到后端去

再来看一下用户选择日期后进行处理的代码

import momentTimeZone from 'moment-timezone';
import moment from 'moment';
import type { Moment } from 'moment';
convert = (value?: Moment | null) => {
        if (value) {
          const valueString = momentTimezone.tz(value.format('YYYY-MM-DD'), 'Asia/Jakarta').format();
          return (moment(valueString).valueOf() / 1000).toFixed();
        }
        return value;
      }

bug的根因

乍一看,没什么问题呀,于是我开始断点,脑溢血的一幕出现了,大家可以去momentjs.com/timezone/do… 这个页面上试一试,百分百复现

Moment的feature导致线上bug解决分析

// 让人大吃一惊的等式
moment.tz('1961-01-01', 'Asia/Jakarta').format() === '1963-12-31T23:30:00+07:00';

这怎么转换之后,日期还给我整错了呢?我的第一反应就是给moment-timezone提issue,结果没想到有人赶在了我的前面 github.com/moment/mome…

官方也解释的很清楚了:由于当地历史原因,雅加达在1964年之前都是按东七半区来计算时区的,1964年开始才按照东七区来计算,总的来说,这个匪夷所思的等式居然是个feature,只是我使用之前没有了解清楚,所以出了bug,这锅是甩不掉了

解决方案

经过一系列的讨论,我们认为其实日期类型的字段用时间戳表达是不准确的,比如元旦这个节日,在全世界任何一个地区都应该是1月1日,可是如果用时间戳表达的话,可能在某些地区的确是1月1日,但是在其他地区却可能是1月2日了,因此正确的设计应该是用日期字符串来进行存储和传输,比如"2022-01-01",这样才能避免类似的bug,于是前端、app和be都进行了对应的修改,并且发布了hotfix

虽然影响范围比较小,但是众所周知虾皮对于质量是看的很重的,特别是线上的质量。。。只是可惜了我的绩效。。

好了以上就是Moment的feature导致线上bug解决分析的详细内容,更多关于Moment feature线上bug的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
jQuery下的几个你可能没用过的功能
Aug 29 Javascript
jquery连缀语法如何实现
Nov 29 Javascript
有关于JS辅助函数inherit()的问题
Apr 07 Javascript
javascript通过navigator.userAgent识别各种浏览器
Oct 25 Javascript
JavaScript自定义方法实现trim()、Ltrim()、Rtrim()的功能
Nov 03 Javascript
jquery模拟alert的弹窗插件
Jul 31 Javascript
基于jQuery实现响应式圆形图片轮播特效
Nov 25 Javascript
JavaScript中的FileReader图片预览上传功能实现代码
Jul 24 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
Aug 17 Javascript
微信小程序实现流程进度的图样式功能
Jan 16 Javascript
JS声明对象时属性名加引号与不加引号的问题及解决方法
Feb 16 Javascript
Vue+element-ui 实现表格的分页功能示例
Aug 18 Javascript
js 实现Material UI点击涟漪效果示例
Sep 23 #Javascript
js 实现验证码输入框示例详解
Sep 23 #Javascript
TypeScript 内置高级类型编程示例
Sep 23 #Javascript
详解Anyscript开发指南绕过typescript类型检查
Sep 23 #Javascript
js基于div丝滑实现贝塞尔曲线
Sep 23 #Javascript
TS 类型兼容教程示例详解
Sep 23 #Javascript
TS 类型收窄教程示例详解
Sep 23 #Javascript
You might like
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
2008/05/26 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
2013/04/28 PHP
浅析PHP页面局部刷新功能的实现小结
2013/06/21 PHP
php中让上传的文件大小在上传前就受限制的两种解决方法
2013/06/24 PHP
用PHP代替JS玩转DOM的思路及示例代码
2014/06/15 PHP
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
浅析PHP编程中10个最常见的错误
2014/08/08 PHP
php判断输入是否是纯数字,英文,汉字的方法
2015/03/05 PHP
浅析php如何实现App常用的秒发功能
2016/08/03 PHP
浅谈PHP中的Trait使用方法
2019/03/22 PHP
javascript实现无限级select联动菜单
2015/01/02 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
2015/12/18 Javascript
js+html5实现的自由落体运动效果代码
2016/01/28 Javascript
读Javascript高性能编程重点笔记
2016/12/21 Javascript
js 输入框 正则表达式(菜鸟必看教程)
2017/02/19 Javascript
vue2.0 实现导航守卫(路由守卫)
2018/05/21 Javascript
使用Angular自定义字段校验指令的方法示例
2019/02/01 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
vue实现登录页面的验证码以及验证过程解析(面向新手)
2019/08/02 Javascript
Vue+Vant 图片上传加显示的案例
2020/11/03 Javascript
Vue实现Header渐隐渐现效果的实例代码
2020/11/05 Javascript
Python数据结构与算法之使用队列解决小猫钓鱼问题
2017/12/14 Python
Python基于TCP实现会聊天的小机器人功能示例
2018/04/09 Python
python3处理含有中文的url方法
2018/05/10 Python
Python之列表的插入&替换修改方法
2018/06/28 Python
Python基于pandas爬取网页表格数据
2020/05/11 Python
Python Scrapy多页数据爬取实现过程解析
2020/06/12 Python
python爬虫使用scrapy注意事项
2020/11/23 Python
中国最大的潮流商品购物网站:YOHO!BUY有货
2017/01/07 全球购物
The North Face意大利官网:服装、背包和鞋子
2020/06/17 全球购物
幼儿园优秀班主任事迹材料
2014/05/14 职场文书
医院搬迁方案
2014/06/14 职场文书
2016同学毕业寄语大全
2015/12/04 职场文书
2019毕业典礼主持词!
2019/07/05 职场文书
vue el-table实现递归嵌套的示例代码
2022/08/14 Vue.js