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是非常痛苦的,而且很轻。


当前回答

对我来说,问题是我忘记在YYYY-MM-DD格式的个位数月或日之前加上0。 我解析的是:2021-11-5 它应该是:2021-11-05

因此,我写了一个小工具,可以将YYYY-M-D转换为YYYY-MM-DD,即2021-1-1转换为2021-01-01:

const date = "2021-1-1"
const YYYY = date.split("-")[0];

    //convert M->MM i.e. 2->02
    const MM =
      date.split("-")[1].length == 1
        ? "0" + date.split("-")[1]
        : date.split("-")[1];

    //convert D->DD i.e. 2->02
    const DD =
      date.split("-")[2].length == 1
        ? "0" + date.split("-")[2]
        : date.split("-")[2];

    // YYYY-MM-DD
    const properDateString = `${YYYY + "-" + MM + "-" + DD}`;

    const dateObj = new Date(properDateString);

其他回答

对我来说,问题是我忘记在YYYY-MM-DD格式的个位数月或日之前加上0。 我解析的是:2021-11-5 它应该是:2021-11-05

因此,我写了一个小工具,可以将YYYY-M-D转换为YYYY-MM-DD,即2021-1-1转换为2021-01-01:

const date = "2021-1-1"
const YYYY = date.split("-")[0];

    //convert M->MM i.e. 2->02
    const MM =
      date.split("-")[1].length == 1
        ? "0" + date.split("-")[1]
        : date.split("-")[1];

    //convert D->DD i.e. 2->02
    const DD =
      date.split("-")[2].length == 1
        ? "0" + date.split("-")[2]
        : date.split("-")[2];

    // YYYY-MM-DD
    const properDateString = `${YYYY + "-" + MM + "-" + DD}`;

    const dateObj = new Date(properDateString);

我也有同样的问题。然后我用了moment. js .问题消失了。

当从字符串创建moment时,我们首先检查字符串是否 匹配已知的ISO 8601格式,然后返回到新的日期(字符串)如果 找不到已知格式。 警告:浏览器对解析字符串的支持不一致。因为 没有关于应该支持哪种格式、支持什么格式的规范 在某些浏览器中的工作将不能在其他浏览器中工作。 为了在解析除ISO 8601字符串以外的任何字符串时得到一致的结果, 你应该使用字符串+格式。

e.g.

var date= moment(String);

要让解决方案在大多数浏览器上都能工作,您应该使用这种格式创建日期对象

(year, month, date, hours, minutes, seconds, ms)

例如:

dateObj = new Date(2014, 6, 25); //UTC time / Months are mapped from 0 to 11
alert(dateObj.getTime()); //gives back timestamp in ms

工作良好的IE, FF, Chrome和Safari。甚至是更老的版本。

IE开发中心:日期对象(JavaScript)

Mozilla Dev Network:日期

尽管您可能希望浏览器支持ISO 8601(或仅限日期的子集),但事实并非如此。我所知道的所有浏览器(至少在我使用的美国/英语地区)都能够解析可怕的美国MM/DD/YYYY格式。

如果已经有了日期的部分,则可能希望尝试使用date . utc()。如果你没有,但你必须使用YYYY-MM-DD格式,我建议使用正则表达式来解析你知道的片段,然后将它们传递给Date.UTC()。

在Safari中也面临同样的问题,它通过在网页中插入这个解决了

 <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en"></script> 

希望它也会对你的案子起作用

谢谢