我有一个函数将具有特定格式的日期字符串转换为JS Date Object:
// param userInputBirthdate is a string with this format `dd.mm.yyyy`
function dateObjFromCHString(userInputBirthdate){
var paramDate = userInputBirthdate.split('.').reverse().join('-');
return new Date(paramDate);
}
当用户填写birthDate输入时,通过调用此函数成功创建日期对象。
但现在在我的单元测试中,我使用此代码模拟用户给出的字符串(我必须出于个人原因计算这样的日期,所以请不要建议简单地写一个字符串日期常数):
var localDateOptions = {month:'2-digit',year:'numeric',day:'2-digit'};
var today = new Date();
olderDate.setDate(today.getDate()-(25*365)); //25 years ago
olderDate = olderDate.toLocaleDateString('fr-CH',localDateOptions).replace(/\//g,'.');//return something like 23.03.1985
但现在当我用函数转换它时:
dateObjFromCHString(olderDate); //returns [date] Invalid Date in IE11
我得到了一个" Invalid Date
"与IE(使用IE11边缘模式测试),但一切正常与FF,Chrome或Opera ...
有人能告诉我IE的问题是什么吗?
注意:我看到了关于这个问题的其他SO主题,并建议使用格式yyyy-mm-dd hh:mm:ss作为新的Date参数,但因为它适用于new Date('2012-03-11')
,我想要知道为什么单元测试代码不起作用。
答案 0 :(得分:0)
我在这个问题的帮助下找到了问题:ToLocaleDateString() changes in IE11
如果您分别记录tolocalDateString
结果的每个字符,您将看到在记录完整结果时未显示未显示的字符。
例如:
var str=(new Date).toLocaleDateString();
for(var i=0;i<str.length;i++)
console.log(i,str.charCodeAt(i),str.charAt(i))
将使用IE11输出类似的内容:
0 8206
1 49 1
2 57 9
3 8206
4 46 .
5 8206
6 48 0
7 53 5
8 8206
9 46 .
10 8206
11 50 2
12 48 0
13 49 1
14 53 5
正如您所看到的,有5个不可见的字符(charcode = 8206)会破坏我从toLocaleDateString结果转换为日期。
我使用momentjs库来解决问题,以处理单元测试中的所有日期函数。