javascript中的日期解析在safari和chrome之间是不同的

bra*_*ing 58 javascript safari parsing google-chrome date

我有以下代码

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

在Chrome上,它会在控制台上正确打印出日期.在Safari中它失败了.谁是正确的,更重要的是处理这个问题的最佳方法是什么?

Eri*_*rik 99

你不能真正使用Date.parse.我建议你使用: 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);
Run Code Online (Sandbox Code Playgroud)

  • 仅在当地时间给出日期时才有效.它剥离时区并应用本地.例如:你在-0500时区你发送的时间是早上11点,你应该在当地时间早上6点回来,但是你会在当地时间早上11点回来. (9认同)
  • Date.parse 刚刚用旧的 safari 发现了我,谢谢你的回答。 (3认同)
  • 正如disso所说,这个答案忽略了时区.它需要一个偏移量为00:00("Z")的字符串,并将其解析为本地字符串.应该使用Date.UTC. (2认同)

jab*_*ley 16

Date.parse根据这个问题的其他答案,我倾向于避免.它似乎不是一种可靠的方式来可靠地处理日期.

相反,我使用了类似下面的功能.这使用jQuery将字符串数组映射到数字数组,但这是一个非常容易删除/更改的依赖项.我还包括我认为合理的默认值,允许您解析2007-01-092007-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);
}
Run Code Online (Sandbox Code Playgroud)


Koo*_*Inc 12

我在几个浏览器中检查了它,是的,safari返回invalid date.顺便说一句,你不必Date.parse在这里使用,new Date([datestring])也会工作.Safari显然需要更多格式化您提供的日期字符串.如果用'/'替换' - ',删除T和点后面的所有内容(.593Z),它会给你一个有效的日期.此代码经过测试,可在Safari中使用

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

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

new Date("2016-02-17T00:05:01+0000".replace(/-/g,'/').replace('T',' ').replace(/(\..*|\+.*/,""))
Run Code Online (Sandbox Code Playgroud)

  • 这会导致您丢失时区以及生成的Date对象的一小部分.我想你可以在最后添加一些额外的代码来重新添加这些组件. (7认同)
  • 不需要第三个正则表达式的括号:`new Date("2016-02-17T00:05:01 + 0000".replace(/ - /g,'/').replace('T','').replace(/\..*|\+*/, ""))` (2认同)

Olm*_*tov 12

我的类似问题是由Safari不知道如何以RFC 822时区格式读取时区引起的.我能够通过使用ISO 8601格式来解决这个问题.如果您控制了日期格式,我就可以使用java的SimpleDateFormat"yyyy-MM-dd'T'HH:mm:ss.sssXXX"为我生成ie."2018-02-06T20:00:00.000 + 04:00".无论出于何种原因,Safari无法读取"2018-02-06T20:00:00.000 + 0400",请注意时区格式中缺少冒号.

// 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);
Run Code Online (Sandbox Code Playgroud)

  • [这篇博文](http://farai.github.io/blog/2015/02/16/javascript-nan-for-new-date-object-in-ie-and-safari/)解释了这个问题和一个正则表达式解决方案,适用于 Safari 和 Internet Explorer,但仍然没有表明 Safari 或 IE 是否在某处承认它们与 ISO 规范不匹配 (2认同)

Aar*_*ieb 5

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

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

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

var date = new Date(Date.parse(datestring));
Run Code Online (Sandbox Code Playgroud)

我们的项目没有使用毫秒说明符,但我不相信这会给你带来问题.


Lon*_*ren 5

我使用以下函数来解析带有时区的日期。Chrome和Safari均可正常运行:

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
Run Code Online (Sandbox Code Playgroud)

  • 这是最安全的方法。我想你应该将最后一个替换更改为“/[az]+/gi”之类的内容,以匹配更广泛的受众,例如使用 UTC 而不是仅使用 T 的日期。 (2认同)