代码之家  ›  专栏  ›  技术社区  ›  Murtuza Z

日期parse在Safari上返回NaN[重复]

  •  0
  • Murtuza Z  · 技术社区  · 6 年前

    我有以下代码

    var c = new Date(Date.parse("2011-06-21T14:27:28.593Z"));
    console.log(c);
    

    它失败了。谁是正确的,更重要的是什么是最好的方法

    0 回复  |  直到 13 年前
        1
  •  121
  •   Erik    13 年前

    你真的不能用Date。作语法分析我建议您使用: new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )

    要拆分字符串,您可以尝试

    var s = '2011-06-21T14:27:28.593Z';
    var a = s.split(/[^0-9]/);
    //for (i=0;i<a.length;i++) { alert(a[i]); }
    var d=new Date (a[0],a[1]-1,a[2],a[3],a[4],a[5] );
    alert(s+ " "+d);
    
        2
  •  27
  •   Olmstov    6 年前

    // Works
    var c = new Date("2018-02-06T20:00:00.000+04:00"));
    console.log(c);
    
    // Doesn't work
    var c = new Date("2018-02-06T20:00:00.000+0400"));
    console.log(c);
    
        3
  •  19
  •   jabley    11 年前

    我倾向于避免 Date.parse

    相反,我使用了下面的函数。这使用jQuery将字符串数组映射到数字数组,但这是一个很容易删除/更改的依赖项。我还包括我认为合理的默认值,以允许您解析 2007-01-09 2007-01-09T09:42:00

    function dateFromString(str) {
      var a = $.map(str.split(/[^0-9]/), function(s) { return parseInt(s, 10) });
      return new Date(a[0], a[1]-1 || 0, a[2] || 1, a[3] || 0, a[4] || 0, a[5] || 0, a[6] || 0);
    }
    
        4
  •  18
  •   Daniel Sokolowski    9 年前

    我已经在几个浏览器中进行了检查,是的,safari返回了 invalid date . 顺便说一句,你不必使用 Date.parse 在这里,只是 new Date([datestring])

    var datestr = '2011-06-21T14:27:28.593Z'.split(/[-T.]/);
    var safdat = new Date( datestr.slice(0,3).join('/')+' '+datestr[3] );
    

    或使用 String.replace(...) :

    new Date("2016-02-17T00:05:01+0000".replace(/-/g,'/').replace('T',' ').replace(/(\..*|\+.*/,""))
    
        5
  •  13
  •   Londeren    8 年前

    function parseDate(date) {
      const parsed = Date.parse(date);
      if (!isNaN(parsed)) {
        return parsed;
      }
    
      return Date.parse(date.replace(/-/g, '/').replace(/[a-z]+/gi, ' '));
    }
    
    console.log(parseDate('2017-02-09T13:22:18+0300'));  // 1486635738000 time in ms
        6
  •  5
  •   AaronSieb    13 年前

    我最终使用了一个库来抵消这一点:

    http://zetafleet.com/blog/javascript-dateparse-for-iso-8601

    包含该库后,您可以使用以下代码创建新日期:

    var date = new Date(Date.parse(datestring));
    

    我们的项目没有使用毫秒说明符,但我认为这不会给您带来问题。

        7
  •  2
  •   adjwilli    6 年前

    您可以添加本地客户端时区偏移,而不是在日期字符串的末尾使用“Z”。您可能需要一种方法来为您生成:

    let timezoneOffset = () => {
        let date = new Date(),
            timezoneOffset = date.getTimezoneOffset(),
            hours = ('00' + Math.floor(Math.abs(timezoneOffset/60))).slice(-2),
            minutes = ('00' + Math.abs(timezoneOffset%60)).slice(-2),
            string = (timezoneOffset >= 0 ? '-' : '+') + hours + ':' + minutes;
        return string;
    }
    

    var c = new Date("2011-06-21T14:27:28.593" + timezoneOffset());

        8
  •  2
  •   Adam Leggett    6 年前

    这是一个比其他人发布的更健壮的ISO 8601解析器。它不处理周格式,但应在所有浏览器中一致地处理所有其他有效的ISO 8601日期。

    function newDate(value) {
      var field = value.match(/^([+-]?\d{4}(?!\d\d\b))(?:-?(?:(0[1-9]|1[0-2])(?:-?([12]\d|0[1-9]|3[01]))?)(?:[T\s](?:(?:([01]\d|2[0-3])(?::?([0-5]\d))?|24\:?00)([.,]\d+(?!:))?)?(?::?([0-5]\d)(?:[.,](\d+))?)?([zZ]|([+-](?:[01]\d|2[0-3])):?([0-5]\d)?)?)?)?$/) || [];
      var result = new Date(field[1], field[2] - 1 | 0, field[3] || 1, field[4] | 0, field[5] | 0, field[7] | 0, field[8] | 0)
      if (field[9]) {
        result.setUTCMinutes(result.getUTCMinutes() - result.getTimezoneOffset() - ((field[10] * 60 + +field[11]) || 0));
      }
      return result;
    }
    
    console.log(newDate('2011-06-21T14:27:28.593Z'));
    console.log(newDate('1970-12-31T06:00Z'));
    console.log(newDate('1970-12-31T06:00-1200'));
        9
  •  1
  •   Anky    9 年前

    我试图通过截短日期并像那样解析它来转换日期,它在safari和ios上运行良好。

    var dateString = "2016-01-22T08:18:10.000+0000";
     var hours = parseInt(dateString.split("+")[1].substr("0","2"));
     var mins = parseInt(dateString.split("+")[1].substr("2"));
     var date = new Date(dateString.split("+")[0]);
     date.setHours(date.getHours()-hours);
     date.setMinutes(date.getMinutes()-mins);
    
        10
  •  1
  •   Ivan Ferrer    4 年前

    使用此选项(Safari/Chrome):

    Date.parse("2018-02-06T20:00:00.000-03:00")
    
        11
  •  0
  •   schnere    5 年前

    function parseDateTime(datetime, timezone) {
    
      base = new Date(datetime.replace(/\s+/g, 'T') + 'Z');
    
      hoursUTC = base.toLocaleTimeString('de-AT',{ timeZone: 'UTC' }).split(':')[0];
      hoursLocal = base.toLocaleTimeString('de-AT',{ timeZone: 'Europe/Vienna' }).split(':')[0];
      
      timeZoneOffsetSign = (hoursLocal-hoursUTC) < 0 ? '-':'+';
      timeZoneOffset = Math.abs(hoursLocal-hoursUTC);
      timeZoneOffset = timeZoneOffsetSign + timeZoneOffset.toString().padStart(2, '0') + ':00';
      
      return new Date(datetime.replace(/\s+/g, 'T') + timeZoneOffset);
    }
    
    localDate = parseDateTime('2020-02-25 16:00:00','Europe/Vienna');
    console.log(localDate);
    console.log(localDate.toLocaleString('de-AT','Europe/Vienna'));