date()函数返回的Safari和Firefox无效的日期(date() function ret

2019-09-04 03:08发布

我格式化以下列方式日期:

date = new Date("2013-05-12 20:00:00");
formattedDate = new Date(date.getFullYear(),date.getMonth(),date.getDate());

当我在Chrome上运行这一点,输出:

Sun May 12 2013 00:00:00 GMT-0700 (PDT)

这正是我需要的,但是当我在Firefox或Safari运行此我得到

Invalid Date

任何一个能提出解决类似的问题。 加分,如果它不需要库,正则表达式或字符串操作。

Answer 1:

而值2013-05-12 20:00:00是由指定的一个几个有效格式ISO8601 ,最好是使用在限定的轮廓RFC3339 ,这是一个子集的ISO8601。

这意味着,你应该有两个T分离器,以及时区偏移量-这可以是数字或Z指定UTC。 换句话说,你应该使用的值等2013-05-12T20:00:00-07:00 ,或同等2013-05-13T03:00:00Z

现在,你是否有一个正确格式的输入值或者没有,那么浏览器的兼容性的问题出现。 所有现代浏览器都支持ISO8601,而一些不同的解释。 例如,在谷歌Chrome,如果省略T它被分析为,即使是有本地时间Z底。 在Internet Explorer中,具有相同的值T省略返回一个无效的日期错误。

更好的办法是使用抽象这些差异的,所以你可以专注于应用程序和浏览器的不怪癖库。 我知道这样做的最好的图书馆是moment.js 。 除了为ISO日期全力支持,你可以在你想自定义格式字符串任何方式解析输入。 它具有许多其他功能也是如此。 我强烈建议你去看看。

使用moment.js ,你可以做到以下几点:

// from a full date-time-offset ISO8601/RFC3339 value
var m = moment('2013-05-12T20:00:00-07:00');

// or from your custom value, with explicit formatting
// this will assume the local time zone because you didn't specify one
var m = moment('2013-05-12 20:00:00','YYYY-MM-DD HH:mm:ss');

// then you can output it in a custom format if you like
m.format("dddd, MMMM Do YYYY, h:mm:ss a"); // "Sunday, May 12th 2013, 8:00:00 pm"

据我所知, moment.js工作在所有的浏览器-包括旧的IE6一样。



Answer 2:

您的日期格式不适合某些浏览器的标准。 解析自定义日期时间格式,你可以把它分解到不同的值,并使用其它Date的构造函数接受year, month, day, hours, minutes, seconds并且是跨浏览器兼容。 对于你的情况下,它会是这样的:

var date = "2013-05-12 20:00:00",
    values = date.split(/[^0-9]/),
    year = parseInt(values[0], 10),
    month = parseInt(values[1], 10) - 1, // Month is zero based, so subtract 1
    day = parseInt(values[2], 10),
    hours = parseInt(values[3], 10),
    minutes = parseInt(values[4], 10),
    seconds = parseInt(values[5], 10),
    formattedDate;

formattedDate = new Date(year, month, day, hours, minutes, seconds);

工作示例这里http://jsbin.com/ewozew/1/edit



Answer 3:

我今天就遇到了这个完全一样的问题,不要使用破折号作为分隔符。 这工作正常,在Chrome,但不是在Safari / iOS版,用斜杠替换破折号修复此问题。 日期功能在Safari,否则突破。

不正确的日期字符串用 -

下面的代码将返回以下

new Date('03-25-2017');

铬:

Sat Mar 25 2017 00:00:00 GMT+0100 (CET)

苹果浏览器:

Invalid Date

因此,只需更换-/。

正确的日期字符串与/

下面的代码将返回以下

new Date('03/25/2017');

Sat Mar 25 2017 00:00:00 GMT+0100 (CET)

Safari浏览器

Sat Mar 25 2017 00:00:00 GMT+0100 (CET)


Answer 4:

我认为你需要的日期,并把它完全工作时间之间的“T”。

date = new Date("2013-05-12T20:00:00");

有允许在规范相当多的可能的日期时间格式,我不认为所有的浏览器都提供所有的可能性。 对于Firefox看到https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/parse

要想真正安全的跨浏览器,你可能想尝试的RFC2822 / IETF日期语法(你基本相同,镀铬吐回了)



Answer 5:

为什么不劫持Date与修复最新在你的代码的开始?

import 'fix-date' // that's ok!


文章来源: date() function returning Invalid Date in Safari and Firefox