Javascript new Date()在Chrome中工作,但在Firefox中不工作

Javascript new Date()在Chrome中工作,但在Firefox中不工作,javascript,google-chrome,date,datetime,firefox,Javascript,Google Chrome,Date,Datetime,Firefox,我正在创建一个日期时间字符串,如下所示:2010-07-15 11:54:21 使用下面的代码,我在Firefox中得到了无效的日期,但在Chrome中效果很好 var todayDateTime = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + seconds; var date1 = new Date(todayDateTime); 在firefox中,date1给了我一个无效的日期,但在chrome中

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

使用下面的代码,我在Firefox中得到了无效的日期,但在Chrome中效果很好

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

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

您不能以任何方式实例化日期对象。它必须以一种特定的方式。以下是一些有效的例子:

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)

Chrome必须更加灵活

资料来源:

评论如下:


EMCAScript规范(即YYYY-MM-DDTHH:MM:ss.sssZ)但是:“如果字符串不符合[ECMAScript定义的]格式,函数可能会退回到任何特定于实现的启发式或特定于实现的日期格式。”Chrome和FF只是有不同的“特定于实现的日期格式”

这适用于所有浏览器-

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

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


详细信息:

这应该适合您:

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));
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));
2014-06-02 10:28:00
请记住,javascript中的月份是从0到11,因此应将月份值减少1,如下所示:

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));
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));
2014-06-02 10:28:00

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

var date = new Date('2013-08-31T17:00:00Z')
但请记住,它根据UTC创建时间。也就是说,如果您生活在GMT+3(比GMT早3小时)时区,它会将此时区偏移量添加到时间中。因此,如果GMT+3(注意是20:00而不是17:00),上述示例将具有此值:

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

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

这在大多数浏览器中也适用

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

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

在使用AngularJS时,我在Firefox和Safari中遇到了类似的问题。例如,如果从Angular返回的日期如下所示:

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));
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));
2014-06-02 10:28:00
使用此代码:

new Date('2014-06-02 10:28:00').toISOString();
在Firefox和Safari中返回无效的日期错误。然而,在铬合金中,它工作得很好。正如另一个答案所说,Chrome很可能只是在解析日期字符串方面更加灵活

我的最终目标是以某种方式安排日期。我发现了一个极好的库,它处理了跨浏览器兼容性问题和日期格式问题。图书馆的名字叫

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

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

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

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

我遇到的一种情况是处理毫秒。FF和IE在尝试创建新日期时无法正确解析此日期字符串。
“2014/11/24 17:38:20.177Z”

他们不知道如何处理
.177Z
。不过Chrome会起作用。

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

  var outputDate = new Date(Date.parse(inputString));
但对于Firefox和Safari来说,事情变得更加复杂。事实上,在Firefox的文档中,它已经说过:()

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

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


在这里,它首先将2013-08-08 11:52:18 UTC转换为2013-08-08T11:52:18Z,然后将其格式转换为Firefox文档中的fit words。此时,Date.parse在任何浏览器中都将始终正确

我使用了以下日期格式,它在所有浏览器中都能正常工作

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);
var target_date=新日期(“2015年7月17日16:55:22”).getTime();
var天、小时、分钟、秒;
var countdown=document.getElementById(“倒计时”);
剩余=设置间隔(函数(){
var current_date=new date().getTime();
var秒数左=(目标日期-当前日期)/1000;
天=parseInt(还剩秒/86400);
剩余秒数=剩余秒数%86400;
小时=parseInt(剩余秒/3600);
剩余秒数=剩余秒数%3600;
分钟=parseInt(剩余秒/60);
秒=parseInt(剩余%60秒);
countdown.innerHTML=“+天+”天,“+小时+”小时,“
+分钟+分钟+秒+秒;
}, 1000);
选项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')//这是一个可以安全使用的简单解决方案,适用于所有浏览器

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

这就是我在Firefox和Chrome上工作的原因:

//格式为“年-月日期hr:min:seconds.ms”
常数d=新日期('2020-1-4 12:00:00.999')
//我们在秒和毫秒之间使用`.`分隔符。
祝你好运…

有一个定义,任何浏览器(包括Firefox和Safari)都可以解析可能的日期字符串:

在哪里

根据
YYYY-MM-DDThh:mmTZD
,示例
2010-07-15 11:54:21
必须转换为
2010-07-15T11:54:21Z