关于toLocaleDateString的坑

Date.prototype.toLocaleDateString 这个要领并不经常运用,然则不消除一些同砚会喜好。笔者照样劝说这部份同砚戒掉这个要领吧。有时候被坑死了还不晓得是什么状况。刚刚从坑里了爬出来,所以总结一下。

从一个实在的故事最先:

夏季的清晨,倒是很清新。某顺序员一醒悟来就收到测试报的一个题目,“页面怎样什么都不显现,js还报错了”。优美的清晨就此毁掉了…

????????????????

顺序员示意一脸懵逼,心想,昨天不是还测试得好好的吗,页面也没有js报错,本日怎样就跪了?不科学呀,看看报错uncaught TypeError: cannot read property 'length' of undefined. 妈蛋,空指针, 一定是背景接口的题目。

说干就干,翻开调试器一下接口要求,完整没题目呀。什么鬼?

????????????????

因而开启js调试形式,看到错误报在一下这一段:

const dateTransform = date => {
    const tmp = date.split('\/');
    if (tmp[1].length !== 2) {
        tmp[1] = '0' + tmp[1];
    }
    if (tmp[2].length !== 2) {
        tmp[2] = '0' + tmp[2];
    }
    return tmp.join('-');
}

dateTransform(new Date().toLocaleDateString());

看到这段代码霎时崩溃,怎样用这类体式格局处置惩罚时候显现 ????????????????
权且以为某猿是加班到凌晨2点写的代码吧(同个物种之间要晓得体贴)。该猿的思绪是转换形如”2017/5/12″如许的字符串为”2017-5-12″,讲道理可以跑起来的。然则为什昨天的代码,到了本日就没法执行了呢?一定是toLocaleDateString的题目。

笔者在firefox中执行了这一段代码,完整一般,然则在chrome中报错。浏览器的题目?

# chrome
console.log(new Date().toLocaleDateString())
> 2017-5-12

#firefox
console.log(new Date().toLocaleDateString())
> 2017/5/12

哈哈哈哈,找到题目了,就是toLocaleDateString的坑。至于为何昨天能跑,本日不能跑,秒懂啦。chrome晋级了。从57晋级到了58。

#Chrome < 58
> new Date().toLocaleDateString()
> output: "2017/5/12"

#Chrome >= 58
> new Date().toLocaleDateString()
> output: "2017-5-12"

此猿想,这个题目也不能完整把锅甩给chrome,dateTransform显著有题目啊,因而改:

const dateTransform = date => {
    const tmp = date.split('\/');
    if(tmp.length === 1){
        return date;
    }
    if (tmp[1].length !== 2) {
        tmp[1] = '0' + tmp[1];
    }
    if (tmp[2].length !== 2) {
        tmp[2] = '0' + tmp[2];
    }
    return tmp.join('-');
}

dateTransform(new Date().toLocaleDateString());

然后全球平静了。
然则某猿思考少焉照样坚决删掉了这一段,用moment去完成Date花样化。

跋文:

起首看看toLocaleDateString是什么东西:

toLocaleDateString() 要领返回该日期对象日期部份的字符串,该字符串花样因差别言语而差别。新增的参数 locales 和 options 使顺序可以指定运用哪一种言语花样化划定规矩,许可定制该要领的表现(behavior)。在旧版本浏览器中, locales 和 options 参数被疏忽,运用的言语环境和返回的字符串花样是各自自力完成的。

from https://developer.mozilla.org…

这要领最大的题目是在差别的浏览器中获得的结果是不一样的,比方

# firefox
> new Date().toLocaleDateString()
> output: "2017/5/12"

#IE11
> new Date().toLocaleDateString()
> output: "2017-5-12"

#Chrome < 58
> new Date().toLocaleDateString()
> output: "2017/5/12"

#Chrome >= 58
> new Date().toLocaleDateString()
> output: "2017-5-12"

所以尽可能不要用toLocaleDateString

    原文作者:lingxuan630
    原文地址: https://segmentfault.com/a/1190000009391790
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞