"Number Expected" IE 11 中的 .toLocalString()/.toISOString() 错误

"Number Expected" Error in IE 11 with .toLocalString()/.toISOString()

我在以下行收到错误 "Number expected":

new Date($('#itemOpenDate').val()).toISOString();

其中 $('#itemOpenDate').val() 是表示日期的字符串,例如“8/11/2016”,仅在 IE 11 中(在 Chrome、Firefox 和 Safari 中测试正常)。

我已将范围缩小到#itemOpenDate 的填充方式。请参阅下面的代码。我收到以下错误:

('#itemOpenDate').val(new Date("8/2/2016").toLocaleString());

但以下工作正常(即使在 IE 11 中):

$('#itemOpenDate').val(new Date("8/2/2016").toDateString());

当然,我想要 .toLocaleString 提供的格式。有什么想法吗?

重现代码:

<!doctype html>
<html>
<head>
<title></title>
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" >
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container" role="main">
    <form class="center-block form-horizontal">
        <div class="form-group">
            <label for="itemOpenDate" class="control-label">Open Date:</label>
            <input type="text" class="form-control input-lg" id="itemOpenDate">
        </div>

        <div class="form-group">
            <button id="updateItemButton"  title="Update Item" type="button" class="btn btn-primary btn-lg btn-block">Update</button>
        </div>
    </form>
</div>

<script type="text/javascript">

$(document).ready(function () {

$("#itemOpenDate").datepicker();

getPunchlistItem();

$("#updateItemButton").click(function () {
    updatePunchlistItem();
});
});

function getPunchlistItem(myPLItemID) {
$('#itemOpenDate').val(new Date("8/2/2016").toLocaleString());  //  error
$('#itemOpenDate').val(new Date("8/2/2016").toDateString());  //  no error
}

function updatePunchlistItem() {
var myOpenDate = new Date($('#itemOpenDate').val()).toISOString();
console.log(myOpenDate);
}
</script>
</body>
</html>

where $('#itemOpenDate').val() is a string representing a date, e.g. "8/11/2016"

这是你的问题。 JavaScript 的 Date 构造函数不需要在规范中支持除 the date/time format 之外的任何内容,它是(从 ES2015 规范开始)ISO-8601 的子集(在 ES5 规范中,他们犯了一个错误,使它不完全是一个子集),例如2016-08-11。任何时候你要求它解析任何其他东西,你都会陷入未定义的行为。您需要有意地解析字符串(使用您自己的代码,或使用像 MomentJS 这样的库)。

我也看到过这个问题,但方式不同。

var date = new Date('2017-07-02 00:00:00Z').toISOString();

这适用于 chrome 但不适用于 IE11。在日期和时间之间添加一个 T 解决了 IE11 中的问题,它在 Chrome 中仍然有效。

var date = new Date('2017-07-02T00:00:00Z').toISOString();

http://plnkr.co/edit/8WAhslAphwR3BHxnq3bE?p=preview