新日期与param - IE11

时间:2015-03-25 10:22:20

标签: javascript string internet-explorer date

我有一个函数将具有特定格式的日期字符串转换为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'),我想要知道为什么单元测试代码不起作用。

1 个答案:

答案 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库来解决问题,以处理单元测试中的所有日期函数。