被new Date().toJSON()坑了

794 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

基础小水坑,大佬请划走

直接上图

image.png

可见toJSON()会把时间往前减8小时...

这个致命问题,让我的我的一个功能模块,在早八点前只能看到昨天的数据!

错因

toJSON()会进行时区处理,默认为0时区,而北京时间为东八区,所以0时区比我们慢了8小时!

解决办法

直接手动处理

new Date().toLocaleDateString().replaceAll('/', '-');

image.png

新问题出现:月、日 补零

image.png

HTML5日期选择器的规范规定日期必须采用 yyyy-MM-dd 格式

最终解决办法

var day = new Date().toLocaleDateString().split("/").map(x=>{
    if(x.length < 2) return x.padStart(2, '0');
    return x;
}).join("-");

image.png

方法扩展

  1. 插件法: Moment.js
moment().format("YYYY-MM-DD");

image.png

这够简单明了吧,但是真学不到啥东西,只能说用起来很方便
当然,也也可以自己封装一个Format方法,这里就没必要细说了

  1. UTC和本地时间之间的时差 计算法
var now = new Date();
now.setMinutes(now.getMinutes() - now.getTimezoneOffset());//猜猜看这一步执行完后now的值是什么?
now = now.toJSON().substring(0, 10);
console.log(now);

说明:从东八区角度,既然toJSON()会扣8小时,那我就提前补上,调用toJSON()后再扣掉,一加一减,正好等于没修改

image.png

  1. 拼接法
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth() + 1 + '';//月份默认:0~11,勿忘 + 1
var day = date.getDay() + '';
console.log(`${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`);

image.png

.......

方法还有很多,暂时也就想到这么多了,基本够用了

后话

看到这里,很多大佬估计会说,这是啥啊,这么简单的问题还用拿出来说嘛,对于大佬来说也许真的不算啥,但是每个人都是一步一步走出来的,像这种小问题,三下五除二就解决了。但是对于初学者可能会在上面拖很久!总之无论再简单的事,总要付诸行动。