alert(new Date('2010-11-29'));

Chrome, ff在这方面没有问题,但safari会喊“无效日期”。为什么?

编辑:好的,根据下面的评论,我使用了字符串解析,并尝试了这个:

alert(new Date('11-29-2010')); //doesn't work in safari
alert(new Date('29-11-2010')); //doesn't work in safari
alert(new Date('2010-29-11')); //doesn't work in safari

编辑2018年3月22日:似乎人们仍然在这里着陆-今天,我会使用moment或date-fns,然后就不用了。Date-fns是非常痛苦的,而且很轻。


当前回答

我们来晚了,但在Safari和iOS中,当使用ES6反勾而不是String()进行类型转换时,我们就遇到了这个问题

这是给'无效日期'错误

const dateString = '2011-11-18';
const dateObj = new Date(`${dateString}`); 

但这是可行的

const dateObj = new Date(String(dateString)); 

其他回答

使用'mm/dd/yyyy'格式。例如:- new Date('02/28/2015')。它在所有浏览器中都运行良好。

这不是最好的解决方案,尽管我只是捕获错误并返回当前日期。我个人觉得不解决Safari的问题,如果用户想要使用一个该死的不符合标准的浏览器——他们就得忍受这些怪癖。

function safeDate(dateString = "") {
  let date = new Date();
  try {
    if (Date.parse(dateString)) {
      date = new Date(Date.parse(dateString))
    }
  } catch (error) {
    // do nothing.
  }
  return date;
}

我建议让你的后端发送ISO日期。

我们来晚了,但在Safari和iOS中,当使用ES6反勾而不是String()进行类型转换时,我们就遇到了这个问题

这是给'无效日期'错误

const dateString = '2011-11-18';
const dateObj = new Date(`${dateString}`); 

但这是可行的

const dateObj = new Date(String(dateString)); 

“劫持约会”和“固定约会”怎么样?无依赖,min + gzip = 280 B

对于使用date-fns的人,我们可以parseISO日期并使用它来格式化

无效的

import _format from 'date-fns/format';

export function formatDate(date: string, format: string): string {
  return _format(new Date(date), format);
}

此函数处理safari抛出无效日期错误。

解决方案 要解决这个问题,我们应该使用:

import _format from 'date-fns/format';
import _parseISO from 'date-fns/parseISO';

export function formatDate(date: string, format: string): string {
  return _format(_parseISO(date), format);
}