我正在尝试做一些相对简单的事情。我有一个格式为 dd/MM/yyyy 的日期,例如:
var newDate = "11/06/2015";
我想将其转换为日期。
此代码仅适用于 Chrome 和 Firefox:
new Date(newDate)
在 IE11 中我得到 Nan
所以我正在尝试这样做:
var parts = newDate.split("/");
var year = parts[2].trim();
var month = parts[1].trim();
var day = parts[0].trim();
var dt = new Date(Number(year), Number(month) - 1, Number(day));
这应该可行,但我遇到了一个非常奇怪的错误。
如果你尝试这段代码:
function myFunction() {
var newDate = "11/06/2015";
var parts = newDate.split('/');
var year = parts[2].trim();
var a = year;
var b = Number(year);
var c = parseInt(year, 10);
var d = parts;
var n = a + "<br>" + b + "<br>" + c + "<br>" + d;
document.getElementById("demo").innerHTML = n;
}
<p>Click the button to see the parse error.</p>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
然后在 IE 中它添加一个神秘字符并打印出 ý2015
并且在 chrome 中它打印出 ?2015
。
事实上,IE 中的部分值是:ý11ý,ý06ý,ý2015
在 Chrome 中:?11?,?06?,?2015
我不明白这些神秘人物是从哪里来的!我的原始字符串只是 "11/06/2015"
似乎没有办法做这么简单的事情,比如从一个简单的字符串中解析一个整数。
Fiddle没有显示隐藏的字符,但我相信它们仍然存在,因为 Number("2015")
导致 NaN
正如您可以清楚地看到 here
有什么想法吗?
更新
字符串中确实有隐藏字符,查了一下发现是这样创建的:
var date = new Date();
var dateToSave = date.toLocaleDateString();
但仅限于 IE。
在 Chrome 或 Firefox 中,输出不包含 U+200E
从左到右的标记,但在 IE 中它包含!
删除 toLocaleDateString()
并将其替换为 kendo.toString(selectedValue, "dd/MM/yyyy")
解决了问题。
作为记录,我还尝试了 moment.js 和以下行:
moment(selectedValue).format("DD/MM/YYYY")
但出于某种原因在 IE11 中结果的最开头有一个隐藏的 U+200E
字符字符串。
最佳答案
我运行了 "11/06/2015".split('').map(function(s){return s.charCodeAt(0)})
(得到Unicode 值),并发现一些有趣的东西:[8206, 49, 49, 8206, 47, 8206, 48, 54, 8206, 47, 8206, 50, 48, 49, 53]
你有一个 U+200E left-to-right mark在那里。我不知道它是怎么到那里的。
删除它,你会没事的。
在这里,您可以复制并粘贴我提供的字符串:"11/06/2015"
。
关于javascript - 在 Javascript 中拆分字符串的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30783955/