1. 程式人生 > >JavaScript new Date()在Safari上的坑

JavaScript new Date()在Safari上的坑

其他 js開發 麻煩 amp container load pro gin 形式

問題描述

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

解決問題

  • 所以在new Date(‘yyyy-MM-dd HH:mm:ss‘)格式化前需要先把字符串轉化為Safari支持的格式,可以是yyyy/MM/dd HH:mm:ss
    yyyy-MM-ddTHH:mm:ss或其他。看下圖



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

技術分享圖片 在Mac Safari控制臺執行
    • new Date(‘2018-11-11 00:00:00‘.replace(/-/g, "/"))

      技術分享圖片 在IE瀏覽器控制臺執行

      終極方案

        • 只是支持Safari不支持,每次new Date需要replace感覺很麻煩,所以這裏給出一個終極方案,就是修改全局的Date的默認行為,修改後當調用new Date時會先格式化
           /**
           * 在Safari和IE8上執行 new Date(‘2017-12-8 11:36:45‘); 會得到Invalid Date
           * 本函數重寫默認的Date函數,以解決其在Safari,IE8上的bug
           */
          Date = function (Date) {
            MyDate.prototype = Date.prototype;
            return MyDate;
      
            function MyDate() {
              // 當只有一個參數並且參數類型是字符串時,把字符串中的-替換為/
      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);
      • 如下圖執行修改Date的方法後,正常使用new Date(‘2018-11-11 00:00:00‘)將不再報Invalid Date

        技術分享圖片 在Mac Safari控制臺執行

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

        技術分享圖片



      作者:小軍617
      鏈接:https://www.jianshu.com/p/dc83b45a9480
      來源:簡書
      簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並註明出處。 註:又由於IE8上根本不支持-分割的日期,所以這裏建議用/分割日期字符串,你也可以不考慮IE8

JavaScript new Date()在Safari上的坑