现在是2019年12月1日0点27分,我的心情依旧难以平静。这个月是2019年的最后一个月,是21世纪10年代的最后一个月,也是第一批90后30岁以前的最后一个月。就是在这个月的第一天的0点0分,我写的代码出了一个bug,简直让我欲哭无泪。

事情是这样的,我们公司在双十一搞了个促销活动,时间是11月1日到12月1日0点整。为了保证在2019-12-01 0点时,所有小程序上双十一相关的UI元素准时下架,我写下了如下代码:

// 查出12月1日的时间戳
new Date('2019-12-01').getTime() //或Date.parse('2019-12-01') 1575158400000
const isS11 = Date.now() < 1575158400000

一切的UI元素都将根据这个isS11这个布尔值进行显示和隐藏。我提前把逻辑写好之后,早早就发布到线上。周五运营的同事问起时还得到我信誓旦旦的保证,我说,肯定没问题,我都安排好了,0点保证下架。

0点的钟声敲响了。老板在群里发了红包,我抢过了之后,打开小程序,看看双十一是不是下线了。意外还是出乎意料的发生了,元素还在!!我有点慌了起来,又尝试了刷新和重新打开小程序,双十一依然还在,纹丝不动。我就觉得脸有点火辣辣的——打脸了!

我马上打开vscode,查找原因,在控制台写下下面的代码:

纳尼?为什么是早上8点???不应该是默认0点吗?不管了,先改正再说,于是加上时分秒:

const isS11 = Date.now() < Date.parse('2019-12-01 00:00')

这回正常了。赶紧紧急提交一个版本先~提交完之后开始翻TC39的规范:终于在这里找到了解释。当Date构造函数接受一个字符串作为参数时,会调用Date.parse来得到时间戳。而在Date.parse中有这么一段话:

When the UTC offset representation is absent, date-only forms are interpreted as a UTC time and date-time forms are interpreted as a local time.

翻译过来就是:当字符串中没有UTC的标记时,只有日期的字符串会被当成UTC时间来解析,有日期和时间的字符串会被当成本地时间来解析。

new Date('2019-12-01') //按UTC0时区的时间0点,相当于北京时间早上8点
new Date('2019-12-01 00:00') //按北京时间0点

我们是东八区,比UTC时间快8个小时。我输入的字符串是2019-12-01被当成UTC时间的12月1日0点,所以换成本地时间是12月1日8点。。。

最后,首先吐槽一下TC39制定规范的大佬们,为什么不能都按本地时间来解析呢?不然我也不会掉到坑里。。不过,好在微信加急审核效率高,只用半个小时就审核通过(这里给微信点个赞

2019年12月的第一个bug的更多相关文章

  1. 日常Git使用——2019年12月11日16:19:03

    1.git介绍 1.1 什么是git? 什么是Git? 比如一个项目,两个人同时参与开发,那么就把这个项目放在一个公共的地方,需要的时候都可以去获取,有什么改动,都可以进行提交. 为了做到这一点,就需 ...

  2. AHKManager.ahk AHK管理器 2019年12月15日

    AHKManager.ahk  AHK管理器  2019年12月15日 快捷键   {Alt} + {F1} ///////////////////////////////////////////// ...

  3. 34.ITerm配置使用——2019年12月24日

    2019年12月23日15:17:36 ITerm使用教程 1.快键键配置 设置方法 设置方法如下: (1)选择 Preference 进入偏好设置: (2)选择 Profiles > Keys ...

  4. 36.React基础介绍——2019年12月24日

    2019年12月24日16:47:12 2019年10月25日11:24:29 主要介绍react入门知识. 1.jsx语法介绍 1.1 介绍 jsx语法是一种类似于html标签的语法,它的作用相当于 ...

  5. 35.ES6语法介绍——2019年12月24日

    2019年12月24日16:22:24 2019年10月09日12:04:44 1. ES6介绍 1.1 新的 Javascript 语法标准 --2015年6月正式发布 --使用babel语法转换器 ...

  6. 24.mongodb可视化工具部署——2019年12月19日

    2019年10月09日17:05:54 教程链接:https://blog.csdn.net/qq_32340877/article/details/79142129 项目名:adminMongo g ...

  7. 22.Express框架——2019年12月19日

    2019年12月19日14:16:36 1. express简介 1.1 介绍 Express框架是后台的Node框架,所以和jQuery.zepto.yui.bootstrap都不一个东西. Exp ...

  8. 20.Nodejs基础知识(上)——2019年12月16日

    2019年12月16日18:58:55 2019年10月04日12:20:59 1. nodejs简介 Node.js是一个让JavaScript运行在服务器端的开发平台,它让JavaScript的触 ...

  9. 19.go语言基础学习(下)——2019年12月16日

    2019年12月16日16:57:04 5.接口 2019年11月01日15:56:09 5.1 duck typing 1. 2. 接口 3.介绍 Go 语言的接口设计是非侵入式的,接口编写者无须知 ...

随机推荐

  1. 我脑中的JVM大全附带Java8的特性

    Java虚拟机-sun classic vm 世界上第一款商用的Java虚拟机. 只能使用纯解释器的方式来执行Java代码. Java虚拟机-ExactVM Exact Memory Manageme ...

  2. Vue中iframe和组件的通信

    最近的项目开发中用到了Vue组件中嵌套iframe,相应的碰到了组件和HTML的通信问题,场景如下:demo.vue中嵌入 test.html 由于一般的iframe嵌套是用于HTML文件的,在vue ...

  3. 车间如何数字化?MES系统来助力

    对于生产过程复杂多变的离散制造企业而言,面临重重考验:生产作业计划频繁变更,制造工艺复杂,在生产过程中的临时插单.材料短缺等现象.通过MES制造执行管理解决方案,搭建协同管理平台,加强控制力.执行力和 ...

  4. Xml格式数据转map工具类

    前言[ 最近在写一个业务,由于调UPS物流的接口返回的是一个xml格式的数据结果,我现在要拿到xml中某个节点的值,而这个xml数据是多节点多层级的,并且这某个节点的值有可能只有一条值,有可能有多条, ...

  5. Redis 使用过程中遇到的具体问题

    1.缓存雪崩和缓存穿透问题 1.1缓存雪崩 简介:缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉. 解决办法:  事前:尽量保证整个 redis 集 ...

  6. Centos7 安装使用virtualenvwrapper

    退出所有的虚拟环境,在物理环境下安装 1.下载安装virtualenvwrapper pip3 install virtualenvwrapper 2.查看python3的文件和virtualenvw ...

  7. 全球唯一标识符 System.Guid.NewGuid().ToString()

    System.Guid.NewGuid().ToString(); //ToString() 为 null 或空字符串 (""),则使用"D". 结果:8209 ...

  8. shell编写for例子

    1.批量打包sh文件 #!/bin/bash -name "*.sh"` do tar -czvf $i.tgz $i done 2.批量解压文件 #!/bin/bash -nam ...

  9. 5.1 RDD编程

    一.RDD编程基础 1.创建 spark采用textFile()方法来从文件系统中加载数据创建RDD,该方法把文件的URL作为参数,这个URL可以是: 本地文件系统的地址 分布式文件系统HDFS的地址 ...

  10. CMakeLists.txt编写常用命令

    目录 1. 设置cmake最小版本 2. 设置项目名称 3. 设置编译目标类型 4. 指定编译包含的源文件 1. 明确指明包含的源文件 2. 搜索指定目录的所有的cpp文件 3. 自定义搜索规则 4. ...