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


当前回答

将字符串转换为日期格式(你必须知道服务器时区)

new Date('2015-06-16 11:00:00'.replace(/\s+/g, 'T').concat('.000+08:00')).getTime()  

where +08:00 =时区从服务器

其他回答

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

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

e.g.

var date= moment(String);

我也遇到过类似的问题。Date.Parse("DATESTRING")适用于Chrome (Version 59.0.3071.115),但不适用于Safari (Version 10.1.1 (11603.2.5))

Safari:

Date.parse("2017-01-22 11:57:00")
NaN

铬:

Date.parse("2017-01-22 11:57:00")
1485115020000

对我有效的解决方案是用“T”替换dateString中的空格。(例如:dateString。(/ /g,"T"))

Safari:

Date.parse("2017-01-22T11:57:00")
1485086220000

铬:

Date.parse("2017-01-22T11:57:00")
1485115020000

注意,Safari浏览器的响应比Chrome浏览器的响应少8hrs (28800000ms),因为Safari以本地TZ返回响应(比UTC晚8hrs)

得到相同TZ的两个时间

Safari:

Date.parse("2017-01-22T11:57:00Z")
1485086220000

铬:

Date.parse("2017-01-22T11:57:00Z")
1485086220000

对我来说,问题是我忘记在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);

使用下面的格式,它可以在所有浏览器上工作

var year = 2016;
var month = 02;           // month varies from 0-11 (Jan-Dec)
var day = 23;

month = month<10?"0"+month:month;        // to ensure YYYY-MM-DD format
day = day<10?"0"+day:day;

dateObj = new Date(year+"-"+month+"-"+day);

alert(dateObj); 

//你的输出看起来像这样“周三3月23日00:00:00 GMT+0530 (IST)”

//注意这将是在当前时区,在这种情况下由IST表示,转换为UTC时区,你可以包括

alert(dateObj.toUTCSting);

//你现在的输出是这样的“Tue, 22 march 2016 18:30:00 GMT”

请注意,现在dateObj以GMT格式显示时间,还请注意日期和时间已相应更改。

“toUTCSting”函数检索格林尼治子午线上的相应时间。它通过建立当前时区与格林威治子午线时区之间的时差来实现这一点。

在上面的例子中,转换前的时间是2016年3月23日00:00小时和分钟。在将GMT+0530 (IST)小时转换为GMT(在这种情况下,它基本上从给定的时间戳中减去5.30小时)后,时间反映了2016年3月22日的18.30小时(正好比第一次时间晚5.30小时)。

进一步将任何日期对象转换为您可以使用的时间戳

alert(dateObj.getTime());

//输出类似于"1458671400000"

这将为您提供时间的唯一时间戳

正如@nizantz前面提到的,在Safari中使用Date.parse()对我来说不起作用。经过一番研究,我了解到File对象的lastDateModified属性已弃用,Safari不再支持它。使用File对象的lastModified属性解决了我的问题。当然不喜欢在网上发现不好的信息。

感谢所有在这篇文章中做出贡献的人,他们帮助我走上了我需要了解的问题的道路。如果没有这些信息,我可能永远也不会发现我的根本问题。也许这能帮助到和我处境相似的人。