新的Date()在Chrome中工作,但在Firefox中不工作


89

我正在创建一个日期时间字符串,如下所示: 2010-07-15 11:54:21

使用以下代码,我在Firefox中获得无效的日期,但在Chrome中正常运行

var todayDateTime = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + seconds;
var date1 = new Date(todayDateTime);

在firefox中,date1给我一个无效的日期,但是在chrome中,它的工作正常,主要原因是什么?


2
如果您想以任何方式使用它,请使用datejs.com
Sinan

并非所有的实现都支持ECMA-262中的格式,因此请始终手动解析字符串(一个库可以提供帮助,但对于单个格式而言可能不是必需的)。
RobG

现在可以使用Firefox。
Sm Yamashita

Answers:


78

您无法以任何方式实例化日期对象。它必须以特定的方式。以下是一些有效的示例:

new Date() // current date and time
new Date(milliseconds) //milliseconds since 1970/01/01
new Date(dateString)
new Date(year, month, day, hours, minutes, seconds, milliseconds)

要么

d1 = new Date("October 13, 1975 11:13:00")
d2 = new Date(79,5,24)
d3 = new Date(79,5,24,11,33,0)

Chrome必须更加灵活。

来源:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

来自炸药评论:

EMCAScript规范仅需要一种日期格式(即YYYY-MM-DDTHH:mm:ss.sssZ),但是实现可以自由支持自定义日期格式:“ 如果字符串不符合[ECMAScript定义的]格式该功能可能会归结为任何特定于实现的启发式或特定于实现的日期格式。 “ Chrome和FF只是具有不同的“特定于实现的日期格式”。


3
我有一个适用于所有浏览器(包括Firefox)的解决方案:stackoverflow.com/a/21984717/586051
Rahul Desai 2014年

7
关于为何存在这种浏览器差异的原因:EMCAScript规范仅要求一种日期格式(即YYYY-MM-DDTHH:mm:ss.sssZ),但是实现可以自由支持自定义日期格式:“ 如果字符串不符合[ECMAScript定义的]格式,则该函数可以退回到任何特定于实现的启发式或特定于实现的日期格式。 “ Chrome和FF只是具有不同的“特定于实现的日期格式”。
apsillers

日期格式(包含“。”的月份)可以在Chrome浏览器中使用,但不能在Firefox中使用:“ Feb”。14,2019'
codescribblr

23

这适用于所有浏览器-

新日期(“ 2001/01/31 12:00:00 AM”)

new Date('2001-01-31 12:00:00')

格式:YYYY-MM-DDTHH:mm:ss.sss

详细信息:http : //www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15


因为我们都知道这是国际标准。w3.org/International/questions/qa-date-format
Bobby Tables

6
因此,您实际上已经测试了所有浏览器?假设您已经拥有了,您还知道将来所有的浏览器也将支持该(非标准)格式吗?
RobG 2014年

1
这对我有用。因此,如果您已经获得了字符串“ 2001-1-31 12:00:00”,我们可以简单地执行以下操作:new Date(str.replace(/-/ g,'/'));
陈建武

@JianwuChen您正在故意将标准格式修改为非标准格式。这不是一个好主意。
JJJ

2
3年后,它无法在Edge和Window Safari上运行。
Mg Thar

13

选项1 :

假设您的时间字符串的格式如下所示:

'2016-03-10 16:00:00.0'

在这种情况下,您可以执行一个简单的正则表达式将其转换为ISO 8601

'2016-03-10 16:00:00.0'.replace(/ /g,'T')

这将产生以下输出:

'2016-03-10T16:00:00.0'

这是标准的日期时间格式,因此受所有浏览器支持:

document.body.innerHTML = new Date('2016-03-10T16:00:00.0') // THIS IS SAFE TO USE

选项2:

假设您的时间字符串的格式如下所示:

'02-24-2015 09:22:21 PM'

在这里,您可以执行以下正则表达式:

'02-24-2015 09:22:21 PM'.replace(/-/g,'/');

这也产生了所有浏览器都支持的格式:

document.body.innerHTML = new Date('02/24/2015 09:22:21 PM') // THIS IS SAFE TO USE

选项3:

假设您的时间字符串不容易调整为支持良好的标准之一。

在这种情况下,最好将您的时间字符串分成不同的部分,并将其用作以下各项的单独参数Date

document.body.innerHTML = new Date(2016, 2, 26, 3, 24, 0); // THIS IS SAFE TO USE


1
var d = new Date('2017-08-28 08:02 PM'.replace(/-/ g,'/')); 这在Chrome和mozilla中都非常适合我。
拉胡尔·曼卡

13

这也适用于大多数浏览器

new Date('2001/01/31 12:00:00')

那是格式

"yyyy/MM/dd HH:mm:ss"

3
无法保证格式可以在任何浏览器中使用,更不用说“全部”了。
RobG

您是对的,答案是根据我的经验得出的。
阿尔维斯

8

如果您仍想使用破折号创建日期,则可以使用以下格式:

var date = new Date('2013-08-31T17:00:00Z')

但请记住,它会根据UTC创造时间。意思是,如果您居住在格林尼治标准时间+3(格林尼治标准时间早3小时)时区,则会将此时区偏移量添加到时间中。因此,如果格林尼治标准时间+3,则上面的示例将具有此值(请注意,该时间为20:00,而不是17:00):

Sat Aug 31 2013 20:00:00 GMT+0300 (FLE Standard Time)

请确保在末尾添加“ Z”字母,否则Chrome和Firefox将以不同的方式解析字符串(一个将添加时间偏移,而另一个将不添加时间偏移)。


1
是的,如果您不提供时区,Chrome和Firefox的行为会有所不同。而且,出于兴趣,我认为Firefox做错了。如果没有时区,则应假定为格林尼治标准时间。Chrome可以,firefox不能。 ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
朱利安·

@JulianJelfs-“ 如果没有时区,则应假定为格林尼治标准时间 ”,仅适用于日期(与ISO 8601相反)。对于日期和时间字符串,应采用本地格式(与ISO 8601一致)。但是无论如何,手动解析是唯一安全的方法。
RobG

5

使用AngularJS时,Firefox和Safari都遇到类似的问题。例如,如果从Angular返回的日期看起来像这样:

2014-06-02 10:28:00

使用此代码:

new Date('2014-06-02 10:28:00').toISOString();

在Firefox和Safari中返回无效的日期错误。但是,在Chrome中可以正常运行。另一个答案是,Chrome最有可能在解析日期字符串时更加灵活。

我最终的目标是以某种方式格式化日期。我发现了一个出色的库,可以处理跨浏览器兼容性问题和日期格式问题。该库称为moment.js

使用此库,以下代码可在我测试过的所有浏览器中正常运行:

moment('2014-06-02 10:28:00').format('MMM d YY')

如果您愿意在应用程序中包含这个额外的库,则可以更轻松地构建日期字符串,同时避免可能的浏览器兼容性问题。作为奖励,如果需要,您将有很好的方法轻松格式化,加,减等日期。


你应该 解析字符串时,始终将格式传递给moment.js,否则它将一直猜测直到找到创建有效日期的格式。
RobG

4

这应该为您工作:

var date1 = new Date(year, month, day, hour, minute, seconds);

我必须创建一个字符串形式的日期,所以我这样做是这样的:

var d = '2013-07-20 16:57:27';
var date1 = new Date(d.substr(0, 4), d.substr(5, 2), d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));

请记住,javascript中的月份从0到11,因此您应将月份值减少1,如下所示:

var d = '2013-07-20 16:57:27';
var date1 = new Date(d.substr(0, 4), d.substr(5, 2) - 1, d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));

2

简单的解决方案,适用于所有浏览器,

var StringDate = "24-11-2017"   
var DateVar = StringDate.split("-");
var DateVal = new Date(DateVar[1] + "/" + DateVar[0] + "/" + DateVar[2]);
alert(DateVal);

1

我遇到的一种情况是在处理毫秒数时。FF和IE在尝试创建新日期时将无法正确解析此日期字符串。 "2014/11/24 17:38:20.177Z" 他们不知道该如何处理.177Z。Chrome可以使用。


0

实际上,Chrome可以更灵活地处理不同的字符串格式。即使您不知道它的String格式,Chrome仍可以成功将String成功转换为Date而不会出现错误。像这样:

  var outputDate = new Date(Date.parse(inputString));

但是对于Firefox和Safari,情况变得更加复杂。实际上,在Firefox的文档中,它已经说过:(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse

表示RFC2822或ISO 8601日期的字符串(可以使用其他格式,但结果可能是意外的)。

因此,当您想在Firefox和Safari中使用Date.parse时,应该小心。对我来说,我使用技巧方法来处理它。(注意:并非在所有情况下都总是正确的)

if (input.indexOf("UTC") != -1) {
  var tempInput = inputString.substr(0, 10) + "T" + inputString.substr(11, 8) + "Z";
  date = new Date(Date.parse(tempInput));
}

在这里,它先将2013-08-08 11:52:18 UTC转换为2013-08-08T11:52:18Z,然后将其格式设置为Firefox文档中的合适字词。目前,Date.parse在任何浏览器中都将始终正确。


0

这是为我工作的FirefoxChrome

// The format is 'year-month-date hr:mins:seconds.milliseconds'
const d = new Date('2020-1-4 12:00:00.999') 
// we use the `.` separator between seconds and milliseconds.

祝好运...


-1

在Firefox中,任何无效的Date都将作为Date对象作为Date返回1899-11-29T19:00:00.000Z,因此请检查浏览器是否为Firefox,然后获取string的Date对象"1899-11-29T19:00:00.000Z".getDate()。最后将其与日期进行比较。


这不是说明问题的原因,而是说明问题的结果是什么。
Rytis

-1

我使用了以下日期格式,并且在所有浏览器中都可以使用。

var target_date = new Date("Jul 17, 2015 16:55:22").getTime();

var days, hours, minutes, seconds;

var countdown = document.getElementById("countdown");

remaining = setInterval(function () {

    var current_date = new Date().getTime();
    var seconds_left = (target_date - current_date) / 1000;
    days = parseInt(seconds_left / 86400);
    seconds_left = seconds_left % 86400;
    hours = parseInt(seconds_left / 3600);
    seconds_left = seconds_left % 3600;
    minutes = parseInt(seconds_left / 60);
    seconds = parseInt(seconds_left % 60);
    countdown.innerHTML = "<b>"+days + " day, " + hours + " hour, "
        + minutes + " minute, " + seconds + " second.</b>";  
}, 1000);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.