五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > 在Safari上JavaScript new Date()返回Invalid Date的解決方法

在Safari上JavaScript new Date()返回Invalid Date的解決方法

文章來源:365jz.com     點擊數(shù):4390    更新時間:2019-10-10 11:08   參與評論

最近在做移動Web的時候,在PC上用Chrome調(diào)試都成功了,但是在iPhone上真機一測就出現(xiàn)了奇怪的問題。經(jīng)過一系列調(diào)試發(fā)現(xiàn)是日期相關(guān)的地方出現(xiàn)了問題。起初懷疑是生產(chǎn)環(huán)境的問題,但用Mac版的safari調(diào)試本地也出現(xiàn)了同樣的問題。查閱一些資料后發(fā)現(xiàn),safari中對于JavaScript的new Date函數(shù)的支持有一個比較奇怪的問題,不只是safari瀏覽器,ios上的瀏覽器都會彈出invalid date,進行new date()轉(zhuǎn)化的時候變成NaN,據(jù)說IE也有此問題,查找資料后修改如下。

  • 我們經(jīng)常用yyyy-MM-dd HH:mm:ss格式表示日期,如2018-11-11 00:00:00,在js開發(fā)中也經(jīng)常會把此格式字符串格式化為javascript Date類型,如new Date('2018-11-11 00:00:00'),不幸的是此操作在Safari瀏覽器(不論是Mac還是iPhone)上會報錯,返回Invalid Date。如下圖所示

    image.png

    在Mac Safari控制臺執(zhí)行

解決問題

  • 所以在new Date('yyyy-MM-dd HH:mm:ss')格式化前需要先把字符串轉(zhuǎn)化為Safari支持的格式,可以是yyyy/MM/dd HH:mm:ssyyyy-MM-ddTHH:mm:ss或其他??聪聢D

new Date('2018-11-11 00:00:00'.replace(/-/g, "/"))new Date('2018-11-11 00:00:00'.replace(/ /g,"T"))

image.png

在Mac Safari控制臺執(zhí)行

  • 注:又由于IE8上根本不支持-分割的日期,所以這里建議用/分割日期字符串,你也可以不考慮IE8

new Date('2018-11-11 00:00:00'.replace(/-/g, "/"))

image.png

在IE瀏覽器控制臺執(zhí)行

終極方案

  • 只是支持Safari不支持,每次new Date需要replace感覺很麻煩,所以這里給出一個終極方案,就是修改全局的Date的默認行為,修改后當調(diào)用new Date時會先格式化

     /**
     * 在Safari和IE8上執(zhí)行 new Date('2017-12-8 11:36:45'); 會得到Invalid Date
     * 本函數(shù)重寫默認的Date函數(shù),以解決其在Safari,IE8上的bug
     */
    Date = function (Date) {
      MyDate.prototype = Date.prototype;
      return MyDate;

      function MyDate() {
        // 當只有一個參數(shù)并且參數(shù)類型是字符串時,把字符串中的-替換為/
        if (arguments.length === 1) {
          let arg = arguments[0];
          if (Object.prototype.toString.call(arg) === '[object String]' && arg.indexOf('T') === -1) {
            arguments[0] = arg.replace(/-/g, "/");
            // console.log(arguments[0]);
          }
        }
        let bind = Function.bind;
        let unbind = bind.bind(bind);
        return new (unbind(Date, null).apply(null, arguments));
      }
    }(Date);
  • 如下圖執(zhí)行修改Date的方法后,正常使用new Date('2018-11-11 00:00:00')將不再報Invalid Date

    image.png

    在Mac Safari控制臺執(zhí)行


  • 注:這段代碼應(yīng)該放在所有new Date操作之前,如html的<head>中,如下圖是我在ionic項目中的配置位置

    image.png

通常,由于習慣了SQL中的datetime格式,日期是打成yyyy-mm-dd的格式,然而,safari竟然不支持這樣的格式,所以當你輸入如下語句時,會返回空的時間,invalid date。

var date = new Date("2016-11-11 11:11:11")

Safari支持的格式是yyyy/mm/dd這樣的,差別主要在于短橫-與斜杠/,而斜杠這樣的格式在其他常見的瀏覽器中也都是可以正常運行的,所以只需要都換成斜杠就可以了,

轉(zhuǎn)換函數(shù): var date = new Date ("2016-04-17 11:11:11".replace(/-/g,'/'));

這樣再進行 var timestamp = date.getTime();即可順利求出時間戳


如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答??! 點擊進入論壇

發(fā)表評論 (4390人查看0條評論)
請自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴禁發(fā)布色情、暴力、反動的言論。
昵稱:
最新評論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學習

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號