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 渐变下拉菜单
Dec 15 Javascript
一行命令搞定node.js 版本升级
Jul 20 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
Sep 02 Javascript
javascript面向对象程序设计(一)
Jan 29 Javascript
javascript实现模拟时钟的方法
May 13 Javascript
javascript每日必学之循环
Feb 19 Javascript
手机端图片缩放旋转全屏查看PhotoSwipe.js插件实现
Aug 25 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
Dec 06 Javascript
解决bootstrap下拉菜单点击立即隐藏bug的方法
Jun 13 Javascript
微信小程序实现的3d轮播图效果示例【基于swiper组件】
Dec 11 Javascript
详解微信小程序开发用户授权登陆
Apr 24 Javascript
JavaScript实现随机点名器
Mar 25 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
PHP实现递归复制整个文件夹的类实例
2015/08/03 PHP
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
2010/01/22 Javascript
JavaScript中yield实用简洁实现方式
2010/06/12 Javascript
jquery 学习之一 对象访问
2010/11/23 Javascript
Javascript 面向对象编程(coolshell)
2012/03/18 Javascript
javascript学习(二)javascript常见问题总结
2013/01/02 Javascript
jQuery弹出(alert)select选择的值
2013/04/21 Javascript
js检测网络是否具体连接功能的代码
2014/05/23 Javascript
node.js中的fs.fchmodSync方法使用说明
2014/12/16 Javascript
jQuery中:file选择器用法实例
2015/01/04 Javascript
JQuery.get提交页面不跳转的解决方法
2015/01/13 Javascript
jQuery实现可以控制图片旋转角度效果(附demo源码下载)
2016/01/27 Javascript
AngularJS ng-mousedown 指令
2016/08/02 Javascript
JavaScript实现表单注册、表单验证、运算符功能
2018/10/15 Javascript
JavaScript继承的特性与实践应用深入详解
2018/12/30 Javascript
详解在vue-cli3.0中自定css、js和图片的打包路径
2019/08/26 Javascript
微信小程序HTTP请求从0到1封装
2019/09/09 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
Vue filter 过滤当前时间 实现实时更新效果
2019/12/20 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
Django框架中的对象列表视图使用示例
2015/07/21 Python
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
详解Python中的array数组模块相关使用
2016/07/05 Python
numpy 声明空数组详解
2019/12/05 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
keras tensorflow 实现在python下多进程运行
2020/02/06 Python
python中if及if-else如何使用
2020/06/02 Python
大数据分析用java还是Python
2020/07/06 Python
HTML5拖放API实现拖放排序的实例代码
2017/05/11 HTML / CSS
Skyscanner英国:苏格兰的全球三大领先航班搜索服务之一
2017/11/09 全球购物
餐饮业经理竞聘演讲稿
2014/01/14 职场文书
项目建议书格式
2014/03/12 职场文书
单位在职证明书
2014/09/11 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
教师正风肃纪剖析材料
2014/10/20 职场文书
单位推荐信范文
2015/03/27 职场文书