现在是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. C++优先队列例子

    #pragma GCC optimize(3) #include <bits/stdc++.h> #define N 105 using namespace std; struct Nod ...

  2. spring boot的gradle整合日志

    1.引入包configurations { providedRuntime // remove default logger all*.exclude group: 'org.springframew ...

  3. Innodb整体架构

    如下图展示了Innodb内存中和磁盘的结构: 内存中结构主要有如下几种: buffer pool change buffer adaptive hash index (自适应的hash索引) Log ...

  4. kafka-python开发kafka生产者和消费者

    1.安装kafka-python 执行命令 pip install kafka-python kafka-python        1.4.6 2.编写python kafka 生产者消费者代码 # ...

  5. day04 作业

    一.简述Python的五大数据类型的作用.定义方式.使用方法: 数字类型 整型 作用:描述年龄 定义方式: x = 10 y = int('10') 使用方法: + - * / % // ** 如果需 ...

  6. 简单使用:spring boot整合spring Data JPA

    JPA顾名思义就是Java Persistence API的意思,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. 1.jpa具有什么优势? (1).标准 ...

  7. java stream 集合运算

    1.对列表进行分组,构建成一个map对象. 键为用户名称,值为用户对象列表. Person p1 = new Person("张三", new BigDecimal("1 ...

  8. Python从零开始——模块与包

    一:Python模块知识概览 二:Python模块的定义与引入 三:模块的搜素与命名空间 四:深入模块 五:模块管理——包的定义与引入

  9. 深入解读Linux进程调度Schedule【转】

    转自:https://blog.csdn.net/Vince_/article/details/88982802 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文 ...

  10. AWS之EC2搭建WordPress博客

    AWS之搭建WordPress博客 注意:请确定您已经成功完成LAMP架构的搭建; 1.下载并解压WordPress安装包: ①使用wget命令在WordPress官网获取最新安装包: [ec2-us ...