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 .ajax 在IE下卡死问题的解决方法
Oct 26 Javascript
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
Nov 30 Javascript
js出生日期 年月日级联菜单示例代码
Jan 10 Javascript
AngularJS实现表单验证
Jan 28 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
Aug 31 Javascript
AngularJS中关于ng-class指令的几种实现方式详解
Sep 17 Javascript
AngularJS用户选择器指令实例分析
Nov 04 Javascript
jQuery插件扩展实例【添加回调函数】
Nov 26 Javascript
BootStrap fileinput.js文件上传组件实例代码
Feb 20 Javascript
javascript编写简易计算器
May 06 Javascript
小程序兼容安卓和IOS数据处理问题及坑
Sep 18 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
Aug 04 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 七大优势分析
2009/06/23 PHP
超清晰的document对象详解
2007/02/27 Javascript
javascript中使用replaceAll()函数实现字符替换的方法
2010/12/25 Javascript
异步加载script的代码
2011/01/12 Javascript
基于jquery实现的省市区级联无ajax
2013/09/24 Javascript
JS 获取浏览器和屏幕宽高等信息代码
2014/03/31 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
js闭包的用途详解
2014/11/09 Javascript
jQuery插件Tmpl的简单使用方法
2015/04/27 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
BootStrap制作导航条实例代码
2016/05/06 Javascript
浅谈MVC+EF easyui dataGrid 动态加载分页表格
2016/11/10 Javascript
JavaScript 日期时间选择器一些小结
2018/04/02 Javascript
layui 实现自动选择radio单选框(checked)的方法
2019/09/03 Javascript
NodeJS 文件夹拷贝以及删除功能
2019/09/03 NodeJs
使用Python编写Linux系统守护进程实例
2015/02/03 Python
Python爬虫DNS解析缓存方法实例分析
2017/06/02 Python
Python实现连接MySql数据库及增删改查操作详解
2019/04/16 Python
Python实现打砖块小游戏代码实例
2019/05/18 Python
python批量修改图片尺寸,并保存指定路径的实现方法
2019/07/04 Python
pycharm运行scrapy过程图解
2019/11/22 Python
Python+OpenCV实现将图像转换为二进制格式
2020/01/09 Python
python字典与json转换的方法总结
2020/12/28 Python
Ever New美国:澳大利亚领先的女装时尚品牌
2019/11/28 全球购物
财务会计毕业生自荐信
2013/11/02 职场文书
大学生自荐书范文
2013/12/10 职场文书
简历中自我评价怎么写
2014/02/12 职场文书
资源工程专业毕业生求职信
2014/02/27 职场文书
英语故事演讲稿
2014/04/29 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
党员转正申请报告
2015/05/15 职场文书
《去年的树》教学反思
2016/02/18 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
MYSQL 无法识别中文的永久解决方法
2021/06/03 MySQL
mysql下的max_allowed_packet参数设置详解
2022/02/12 MySQL
Redis 报错 error:NOAUTH Authentication required
2022/05/15 Redis