toLocaleDateString() ใน IE ส่งคืนสตริงอักขระ 14 ตัว - มันเป็นข้อบกพร่องหรือไม่

โปรดดูที่ http://jsbin.com/mehowehase/1/edit?html,js,console

var dt = new Date();
var x = dt.toLocaleDateString();
console.log("length : "+x.length);
var arr = x.split("/");
console.log("month : "+parseInt(arr[0],10));

ข้างต้นความยาวของ x คือ 14 ใน IE แต่ 9 ในเบราว์เซอร์อื่น นอกจากนี้ค่าเดือนยังมาเป็น NaN นี่เป็นข้อผิดพลาดใน IE หรือไม่ เราจะแก้ไขปัญหานี้ได้อย่างไร.


person dev    schedule 03.11.2015    source แหล่งที่มา


คำตอบ (4)


นี่เป็นข้อผิดพลาดใน IE11 คุณสามารถดูวิธีแก้ปัญหาชั่วคราวสำหรับปัญหานี้ได้ที่นี่

โดยทั่วไปคุณต้องแทนที่ U+200E (เครื่องหมายซ้ายไปขวา)

console.log((new Date()).toLocaleDateString().replace(/\u200E/g, ''));
person Vlad Bezden    schedule 15.03.2016

สำหรับฉันบน Chrome 42.0 เอาต์พุตสตริงของ toLocaleDateString คือ "11/3/2015" สำหรับ Internet Explorer 11.0.9 คือ "วันอังคารที่ 3 พฤศจิกายน 2015" คุณจะต้องเปลี่ยนการแยกวิเคราะห์เพื่ออ่านรูปแบบที่ Internet Explorer ส่งออก ซึ่งมีข้อมูลทั้งหมดที่คุณต้องการ อยู่ในรูปแบบอื่น

person John Biddle    schedule 03.11.2015
comment
ขอบคุณสำหรับคำตอบของคุณจอห์น Internet explorer ก็ให้ฉัน 3/11/2558 เช่นกัน เราจะจัดการสิ่งนี้ได้อย่างไรเพื่อให้โค้ดชิ้นเดียวกันทำงานได้ในทุกเบราว์เซอร์ - person dev; 04.11.2015

แก้ได้แบบนี้ครับ

var day = arr[1];
var month = arr[0];
var year = arr[2];
if(isNaN(month)){
   var curr = "";
   for (var i = 0; i < month['length']; i++) {
      if(!isNaN(month.charAt(i)))
         curr += parseInt(month.charAt(i));
   }
   month = curr;
}
console.log("month: "+parseInt(month,10));
person dev    schedule 03.11.2015
comment
วิธีนี้จะใช้งานได้ก็ต่อเมื่อรูปแบบระบบของคุณตั้งค่าเป็นวันที่แบบสั้น และคุณใช้รูปแบบวันที่ ดด/วว/ปปปป หากคุณต้องการทราบเดือน เพียงถามวัตถุ dt -- var month=dt.month; - person Robert McKee; 04.11.2015

มันไม่ใช่ข้อผิดพลาด เมธอด toLocaleDateString ของ IE ส่งคืนสตริง Unicode และโค้ดของคุณไม่ได้คาดหวังไว้ ตัวอย่างเช่น อักขระตัวแรกใน IE (สำหรับฉันและภาษาของฉัน (en-US)) คือ 8206 ซึ่งเป็นอักขระที่ทำเครื่องหมายจากซ้ายไปขวา ซึ่งเป็นสาเหตุที่ parseInt ของคุณล้มเหลวเช่นกัน ลำดับทั้งหมดก็คือ

8206,49,49,8206,47,8206,51,8206,47,8206,50,48,49,53

ซึ่งมีความยาว 14 ตัวอักษรและดูเหมือน "11/3/2015"

ทำไมคุณไม่ทำสิ่งนี้:

var dt=new Date();
var day=dt.day;
var month=dt.month;
var year=dt.year;
person Robert McKee    schedule 03.11.2015
comment
มีวิธีที่เราสามารถวางหรือแทนที่ 8206 เหล่านี้เพื่อให้ทำงานเหมือนกับในเบราว์เซอร์อื่นหรือไม่ ขอบคุณ. - person dev; 04.11.2015
comment
คุณสามารถส่งออกมันได้ดี หากคุณต้องการทราบเดือน เหตุใดคุณจึงแปลง Date เป็นสตริงแล้วพยายามแยกวิเคราะห์ - person Robert McKee; 04.11.2015