【发布时间】:2015-08-27 08:02:58
【问题描述】:
我正在尝试做一些相对简单的事情。我有一个日期格式为 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));
应该可以,但是我遇到了一个很奇怪的bug。
如果你试试这个代码:
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中parts的值是:ý11ý,ý06ý,ý2015
在 Chrome 中:?11?,?06?,?2015
我不明白这些神秘人物是从哪里来的!我原来的字符串只是"11/06/2015"
be似乎没有办法做这么简单的事情,比如从一个简单的字符串中解析一个整数。
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 字符。
【问题讨论】:
-
也许这不是解决办法,但你为什么不尝试通过这样做来获取日期:
var day = date[0]+date[1]; -
我尝试了你的代码,当我重新输入日期时它工作正常,也许你有一些不可打印的字符
-
有趣的是,我的编辑让问题消失了。它不再在 Chrome 中显示奇怪的字符。但是,是的,您的字符串中有不可打印的字符。如果您编辑代码,并将光标放在
/之一之后并按删除键,您会注意到/没有被删除。这意味着有一些其他字符被删除了。 -
你用什么做编辑?你从哪里复制日期字符串?
-
parseInt将字符串解析为数字。在数字上使用它没有意义,并且可能会导致问题,例如parseInt(1e300, 10)。
标签: javascript internet-explorer-11 parseint