2016-06-13 112 views
1

我有一个日期格式无效的签发日期,但日期是无效

2016年3月3日20:01

而且我有一个代码

aData._date = new Date(aData[3]).getTime(); 

错误是日期无效,但是,在不同的计算机上它运行良好,但现在它不工作。问题是什么?

在此先感谢

+1

因为在你的不同的计算机上,你使用的是Firefox。现在你正在使用chrome。只有那些可以将不明确的日期格式字符串解析成日期对象的chrome。 – choz

+0

我该如何在Chrome和Firefox上运行这个? –

+2

您可以轻松使用'moment.js'。或解析日期字符串为ISO8601格式第一个 – choz

回答

0

你可以先分析你的日期字符串ISO8601格式。

'03.03.2016 20:01' to '2016-03-03T20:01:00' 

当您通过日期字符串Date构造函数,它调用Date.parse方法。它只接受ISO8601的一个版本。但不知何故,chrome具有扩展功能,可将类似日期的字符串解析为Date.parse方法。

如果您不想使用外部库,这是实现您想要的一种方法。

var dateStr = aData[3]; // 03.03.2016 20:01 
var matches = dateStr.match(/[0-9]+/g); 
var year = matches[2]; 
var month = matches[1]; 
var day = matches[0]; 
var hour = matches[3]; 
var minute = matches[4]; 

var formattedDateStr = year + '-' + month + '-' + day + 'T' + hour + ':' + minute; 
aData._date = new Date(formattedDateStr).getTime(); 
+0

对我来说,如果你要去到解析字符串的麻烦,你应该直接将值传递给Date构造函数,而不是回到使用它来解析另一个字符串的变幻莫测。 – RobG

+0

@RobG哈哈..我没有注意到'月'或'一天.. ..所以我打算创造他们的情况下,OP要切换EM .. :) – choz

+0

我认为你错过了我的观点。而不是创建一个新的字符串,并使用日期来解析它,直接提供的值:'新的日期(年,月-1,日,小时,分钟)'这是可能的兼容和完全可靠的ECMAScript的每个实施,可能现在或将来都在使用。 – RobG

0

问题是什么?使用Date构造字符串

解析(或Date.parse,两者是等价的解析)在很大程度上是依赖于实现的,因此不推荐。手动解析字符串,如果您只需处理单一格式,或者使用一个库(有许多好的选择),则使用小函数进行手动解析,否则提供格式。

ECMAScript 2015指定Date.parse正确解析ISO 8601扩展格式日期,但是任何其他格式都是依赖于实现的。许多正在使用的浏览器不正确(即按规范)解析ISO 8601格式的日期。

“03.03.2016 20:01”不是ISO 8601日期格式。假设它的DD.MM.YYYY HH:MM可以解析为一个本地日期和时间使用:

function parseDMYHM(s){ 
 
    var b = ('' || s).split(/\D/); 
 
    return new Date(b[2], b[1]-1, b[0], b[3], b[4]); 
 
} 
 

 
document.write(parseDMYHM('03.03.2016 20:01'));

或者,如果你有一个图书馆有解析函数接受格式来解析(像这样的图书馆是任何好的意愿),使用类似的东西:

var d = parse('03.03.2016 20:01', 'DD.MM.YYYY hh:mm'); 
+0

不错的做法..我建议OP去第二个是创建自己的'parse'方法.. – choz