成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Javascript時(shí)間構(gòu)造的詭異

banana_pi / 2111人閱讀

摘要:為我們提供了不是很好用的作為時(shí)間日期對(duì)象,除了接口設(shè)計(jì)怪異之外,還有一些隱藏很深的,先看接口設(shè)計(jì)直接返回當(dāng)前時(shí)間字符串,無(wú)參數(shù)。可接受一個(gè)數(shù)字參數(shù),該參數(shù)表示與年月日點(diǎn)之間的毫秒數(shù)??山邮苣暝氯諘r(shí)分秒?yún)?shù),是本地時(shí)間。付出慘痛的代價(jià)。

JavaScript為我們提供了不是很好用的Date作為時(shí)間日期對(duì)象,除了接口設(shè)計(jì)怪異之外,還有一些隱藏很深的bug,先看接口設(shè)計(jì):

Date()直接返回當(dāng)前時(shí)間字符串,無(wú)參數(shù)。

new Date()則是會(huì)根據(jù)參數(shù)來(lái)返回對(duì)應(yīng)的時(shí)間對(duì)象,參數(shù)很有意思:

// 無(wú)參數(shù),并返回當(dāng)前時(shí)間。
new Date();
// 可接受一個(gè)數(shù)字參數(shù),該參數(shù)表示與1970年1月1日0點(diǎn)之間的毫秒數(shù)。
new Date(value);
// 可接受一個(gè)字符串參數(shù),參數(shù)形式類似于Date.parse()方法。
new Date(dateString);
// 可接受年月日時(shí)分秒?yún)?shù),是本地時(shí)間。
new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]]);

先且不說(shuō)這樣的接口未免不夠靈活(很難處理各種字符串格式的時(shí)間),最詭異的一點(diǎn)是其中使用dateString的那個(gè)構(gòu)造方法,MDN網(wǎng)站在這個(gè)函數(shù)下有下面一段注釋:

注意這里用的是strongly discouraged - 強(qiáng)烈不推薦使用,原先的我沒(méi)有重視這句話,直到。。。付出慘痛的代價(jià)。

現(xiàn)象

我的一款每日打卡類的App,因?yàn)橛写罅康臅r(shí)間運(yùn)算,為了能接受各種時(shí)間,我做了一個(gè)方便的函數(shù):

date2ymd(input) {
    let day = (input instanceof Date) ? input : new Date(input)
    return `${day.getFullYear()}-${day.getMonth() + 1}-${day.getDate()}`
}

上面的函數(shù)在某些input時(shí)沒(méi)有問(wèn)題,但當(dāng)參數(shù)為類似’2018-10-1’這種格式,按照MDN的文檔,就屬于強(qiáng)烈不推薦使用的形式,但我沒(méi)有留意,App發(fā)布之后,不錯(cuò),大部分用戶沒(méi)有反饋問(wèn)題,直到某天,一個(gè)阿根廷的用戶給我郵件反饋,說(shuō)界面上的日歷似乎錯(cuò)亂了,我試著更改自己的時(shí)區(qū)到對(duì)應(yīng)的-3時(shí)區(qū),截圖一看:

上圖中彩色小方塊的區(qū)域是年視圖,本來(lái)應(yīng)該和下面的日歷一一對(duì)應(yīng),但在這個(gè)時(shí)區(qū)下,年視圖完全錯(cuò)位了,肯定是哪里計(jì)算錯(cuò)誤了,經(jīng)過(guò)調(diào)試,我找到了上面這個(gè)函數(shù),并發(fā)現(xiàn)了問(wèn)題,我們用chrome的console演示一下:

看到了嗎? 從9號(hào)到10號(hào),轉(zhuǎn)換出的時(shí)間沒(méi)有翻天,當(dāng)然,我們可以為這種轉(zhuǎn)換找到理由,JS應(yīng)該是把這種參數(shù)當(dāng)成UTC時(shí)間了,我們看看firefox:

Firefox的表現(xiàn)可以理解,因?yàn)閁TC和-3:00時(shí)區(qū)之間有個(gè)時(shí)間差,雖然這依然不是我想要的,但比起chrome的跳變要好接受一些,我們把輸入時(shí)間換一個(gè)格式,再看下在chrome下的例子:

這種格式終于符合了正常邏輯,也就是短杠和斜杠分隔的時(shí)間處理上是不一致的,斜杠分隔的時(shí)間終于正確的按照了本地時(shí)間進(jìn)行處理。

結(jié)論

正如MDN所說(shuō),不要使用單字符串參數(shù)的Date構(gòu)造函數(shù),即使你知道各種格式之間的區(qū)別,也不建議使用,畢竟記憶這些微妙,甚至不兼容的差別毫無(wú)意義。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100296.html

相關(guān)文章

  • 你是否理解jsObject與Function與原型鏈

    摘要:原型對(duì)象是由創(chuàng)建的,因此原型對(duì)象的構(gòu)造函數(shù)是構(gòu)造函數(shù)也可以是稱為對(duì)象,原型對(duì)象也就繼承了其生父構(gòu)造函數(shù)中的數(shù)據(jù),也同時(shí)繼承了原型對(duì)象的數(shù)據(jù)。當(dāng)然這條原型鏈中的數(shù)據(jù),會(huì)被還是還是這類構(gòu)造函數(shù)繼承,但是不會(huì)被這些繼承,他們不處于同一個(gè)鏈條上。 js中,F(xiàn)unction的本質(zhì)是什么?Object的本質(zhì)又是什么?js中有幾條原型鏈? showImg(https://segmentfault.c...

    itvincent 評(píng)論0 收藏0
  • 四個(gè)最詭異 CSS 特性

    摘要:作為一個(gè)創(chuàng)始人拍腦袋天搞出的語(yǔ)言,中包含了很多在今天看來(lái)很多不應(yīng)該出現(xiàn)在現(xiàn)代語(yǔ)言中的詭異特性。今天我就來(lái)聊聊我認(rèn)為的那些最詭異的特性。和有個(gè)很詭異的特性。外邊距折疊,或簡(jiǎn)稱邊距折疊據(jù)說(shuō)這個(gè)詭異的特性最初設(shè)計(jì)是為簡(jiǎn)化文章排版的。 JavaScript 作為一個(gè)創(chuàng)始人拍腦袋 10 天搞出的語(yǔ)言,JS 中包含了很多在今天看來(lái)很多不應(yīng)該出現(xiàn)在現(xiàn)代語(yǔ)言中的詭異特性。其實(shí),作為 Web 中必不可少...

    yunhao 評(píng)論0 收藏0
  • 一次詭異關(guān)于filter問(wèn)題

    摘要:接收前臺(tái)請(qǐng)求封裝的時(shí),莫名傳到后臺(tái)就變成了。找了半天,一直以后是前臺(tái)的問(wèn)題,一直在翻閱各種代碼。后來(lái),請(qǐng)教大佬,大佬一聽(tīng)到剛好少了后,靈光乍現(xiàn),感覺(jué)是攔截器的原因,后來(lái)查閱,果不其然。全稱跨站腳本攻擊,是程序中最常見(jiàn)的漏洞。 接收前臺(tái)post請(qǐng)求封裝的versionDescription:eeeeee,時(shí),莫名傳到后臺(tái)就變成versionDeion:eeeeee,了。 找了半天,一直...

    BlackHole1 評(píng)論0 收藏0
  • 關(guān)于“時(shí)間一次探索

    摘要:示例指定了也就是零時(shí)區(qū),顯示的時(shí)間會(huì)加上本地時(shí)區(qū)的偏移小時(shí)。其實(shí)就是上面顯示時(shí)間時(shí)使用的形式除了能表示基本信息,還可以表示星期,但是一點(diǎn)也不容易讀,不建議使用。 原文對(duì) ISO 8601 時(shí)間格式中 T 和 Z 的表述有一些錯(cuò)誤,我已經(jīng)對(duì)原文進(jìn)行了一些修訂,抱歉給大家造成誤解。 最近使用 sequelize 過(guò)程中發(fā)現(xiàn)一個(gè)奇怪的問(wèn)題,將某個(gè)時(shí)間插入到表中后,通過(guò) sequelize 查...

    fuyi501 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<