2016-08-16 56 views
1

我得到錯誤 「號預計」 在該行:「號應爲」 錯誤的IE 11 .toLocalString()/ toISOString()

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> 

回答

0

其中$('#itemOpenDate').val()是表示日期的字符串,例如「2016/11/11」

這是你的問題。 JavaScript的Date構造函數不需要支持規範中的任何內容,但是(ISO規範中的the date/time format)(是ES2015規範的一部分)是ISO-8601的子集(在ES5規範中,他們犯了一個錯誤,導致它不是一個子集) ,例如2016-08-11。無論何時你要求它解析別的東西,你都會陷入未定義的行爲。你需要有意識地解析字符串(用你自己的代碼,或者像MomentJS這樣的庫)。

+0

是因爲_'Invalid Date'_的? – Rayon

+1

@Rayon:可能,這取決於IE11在面對一個不理解的字符串時決定做什麼。它可能會構造一個無效的日期(例如,相當於'new Date(NaN)'),在這種情況下'getHours'等全部返回'NaN'。 –

1

我也看到了這個問題,但以不同的方式。

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