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 相关文章推荐
JavaScript对象的property属性详解
Apr 01 Javascript
使用Plupload实现直接上传附件至七牛云存储
Dec 26 Javascript
JS封装cookie操作函数实例(设置、读取、删除)
Nov 17 Javascript
基于BootStrap的图片轮播效果展示实例代码
May 23 Javascript
Vue2递归组件实现树形菜单
Apr 10 Javascript
JavaScript学习笔记之惰性函数示例详解
Aug 27 Javascript
Angular客户端请求Rest服务跨域问题的解决方法
Sep 19 Javascript
node.js实现为PDF添加水印的示例代码
Dec 05 Javascript
puppeteer库入门初探
Jan 09 Javascript
使用koa2创建web项目的方法步骤
Mar 12 Javascript
浅谈redux, koa, express 中间件实现对比解析
May 23 Javascript
Vant picker 多级联动操作
Nov 02 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 include加载文件两种方式效率比较
2010/08/08 PHP
php中 ob_start等函数截取标准输出的方法
2015/06/22 PHP
基于thinkPHP类的插入数据库操作功能示例
2017/01/06 PHP
PDO操作MySQL的基础教程(推荐)
2017/08/18 PHP
php实现断点续传大文件示例代码
2020/06/19 PHP
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
2006/12/22 Javascript
表单提交时自动复制内容到剪贴板的js代码
2007/03/16 Javascript
javascript数字数组去重复项的实现代码
2010/12/30 Javascript
javascript学习笔记(六) Date 日期类型
2012/06/19 Javascript
jquery简单实现外部链接用新窗口打开的方法
2015/05/30 Javascript
jQuery实现带有洗牌效果的动画分页实例
2015/08/31 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
2015/11/15 Javascript
全面解析Bootstrap手风琴效果
2020/04/17 Javascript
jQuery Html控件基本操作(日常收集整理)
2016/03/11 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
2016/03/25 Javascript
jQuery操作json常用方法示例
2017/01/04 Javascript
js 性能优化之算法和流程控制
2017/02/15 Javascript
JS调用安卓手机摄像头扫描二维码
2018/10/16 Javascript
laydate时间日历插件使用方法详解
2018/11/14 Javascript
详解js location.href和window.open的几种用法和区别
2019/12/02 Javascript
vue实现扫码功能
2020/01/17 Javascript
JSONObject与JSONArray使用方法解析
2020/09/28 Javascript
比较详细Python正则表达式操作指南(re使用)
2008/09/06 Python
python分割文件的常用方法
2014/11/01 Python
Python 解决中文写入Excel时抛异常的问题
2018/05/03 Python
python批量生成条形码的示例
2020/10/10 Python
基于CSS3制作立体效果导航菜单
2016/01/12 HTML / CSS
英国鹦鹉店:Parrot Essentials
2018/12/03 全球购物
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
2012/05/30 面试题
车间班组长的职责
2013/12/13 职场文书
学校庆元旦歌咏比赛主持词
2014/03/18 职场文书
工厂采购员岗位职责
2014/04/08 职场文书
答谢会策划方案
2014/05/12 职场文书
2019最新劳动仲裁申请书!
2019/07/08 职场文书
python实现股票历史数据可视化分析案例
2021/06/10 Python