带参数的新日期 - IE11

new Date with param - IE11

我有一个函数可以将具有特定格式的日期字符串转换为 JS 日期对象:

// 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

我在 IE 中得到一个“Invalid Date”(使用 IE11 边缘模式测试),但在 FF、Chrome 或 Opera 中一切正常... 谁能告诉我 IE 的问题是什么?

注意:我看到了关于此问题的其他 SO 线程以及对新日期参数使用格式 yyyy-mm-dd hh:mm:ss 的建议,但因为它适用于 new Date('2012-03-11'),我想知道为什么单元测试代码不起作用。

我在这个问题的帮助下找到了问题: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 库处理所有日期函数解决了这个问题。