วันที่ใหม่ () ทำงานแตกต่างกันใน Chrome และ Firefox


94

ฉันต้องการแปลงสตริงวันที่Dateโดยใช้จาวาสคริปต์ใช้รหัสนี้:

var date = new Date('2013-02-27T17:00:00');
alert(date);

'2013-02-27T17:00:00' คือเวลา UTC ในออบเจ็กต์ JSON จากเซิร์ฟเวอร์

แต่ผลลัพธ์ของโค้ดด้านบนแตกต่างกันระหว่าง Firefox และ Chrome:

ผลตอบแทนของ Firefox:

Wed Feb 27 2013 17:00:00 GMT+0700 (SE Asia Standard Time)

Chrome ส่งคืน:

Thu Feb 28 2013 00:00:00 GMT+0700 (SE Asia Standard Time) 

มันต่างกัน 1 วันผลลัพธ์ที่ถูกต้องที่ฉันคาดหวังคือผลลัพธ์จาก Chrome

รหัสสาธิต: http://jsfiddle.net/xHtqa/2/

ฉันจะแก้ไขปัญหานี้เพื่อให้ได้ผลลัพธ์เดียวกันจากทั้งสองอย่างได้อย่างไร


2
บนคอมพิวเตอร์เครื่องเดียวกันหรือไม่
Aaron Digulla

4
@Sandeep ประเด็นหลักคือ Chrome เพิ่มการชดเชยเขตเวลาในขณะที่ Firefox ไม่
เริ่มต้น

3
@CuongLe คุณเคยเห็นคำถามนี้ไหม: stackoverflow.com/questions/9062863/…
default locale

1
มันDate {Wed Feb 27 2013 17:00:00 GMT+0000 (GMT)}สำหรับผมทั้งใน (Linux)
marekful

1
มุมของ Nitpicker: «เวลา UTC ในรูปแบบ JSON » - รูปแบบ JSON? ที่แน่นอนข้อร้องเรียนทั่วไปเกี่ยวกับ JSON คือไม่มีการกำหนดรูปแบบวันที่ใด ๆ เลย
ÁlvaroGonzález

คำตอบ:


67

รูปแบบที่ถูกต้องสำหรับ UTC จะเป็น2013-02-27T17:00:00Z(Z สำหรับเวลาซูลู) ต่อท้ายZหากไม่มีเพื่อรับสตริงวันเวลา UTC ที่ถูกต้อง


2
ขอบคุณ. นี้ได้ผล แต่มีบันทึกบอกว่าจะเลิกใช้งานในอนาคต !!!. ความคิดใด ๆ โปรด?
Débora

1
ขอบคุณมากฉันนั่งกับปัญหานี้มาสองวันแล้ว แต่โพสต์นี้แก้ไขทุกอย่างได้
Piyal George

30

ใช่น่าเสียดายที่อัลกอริทึมการแยกวิเคราะห์วันที่ขึ้นอยู่กับการใช้งาน จากข้อกำหนดของDate.parse (ซึ่งใช้โดยnew Date):

String อาจตีความเป็นเวลาท้องถิ่นเวลา UTC หรือเวลาในเขตเวลาอื่น ๆ ขึ้นอยู่กับเนื้อหาของ String ฟังก์ชันแรกจะพยายามแยกวิเคราะห์รูปแบบของ String ตามกฎที่เรียกใน Date Time String Format ( 15.9.1.15 ) หากสตริงไม่สอดคล้องกับรูปแบบดังกล่าวฟังก์ชันอาจถอยกลับไปใช้การวิเคราะห์พฤติกรรมเฉพาะการใช้งานหรือรูปแบบวันที่เฉพาะการนำไปใช้งาน

เพื่อให้Dateคอนสตรัคไม่ได้ (อาจจะ) ใช้เขตเวลาท้องถิ่นใช้สตริง datetime "2013-02-27T17:00:00Z"ที่มีข้อมูลเขตเวลาเช่น อย่างไรก็ตามมันยากที่จะหารูปแบบที่มีการแยกวิเคราะห์ที่เชื่อถือได้โดยทุกเบราว์เซอร์ - IE <8 ไม่รู้จักรูปแบบ ISO (ดูJavaScript: เบราว์เซอร์ใดที่รองรับการแยกวิเคราะห์ ISO-8601 Date String ด้วย Date.parse ) ดีกว่าใช้การประทับเวลายูนิกซ์มิลลิวินาทีคือตั้งแต่ยูนิกซ์ยุคDate.UTCหรือใช้การแสดงออกปกติที่จะทำลายเชือกลงไปในส่วนของตนแล้วป้อนเข้าสู่เหล่านั้น


2
แต่ข้อมูลจำเพาะ (15.9.1.15) บอกว่า: "ค่าของการชดเชยเขตเวลาที่ไม่มีอยู่คือ" Z "" ดังนั้นจึงไม่ควรขึ้นอยู่กับการนำไปใช้งาน
sinelaw

12
ตกลงการแก้ไข ดูเหมือนข้อผิดพลาดในข้อกำหนด ES5.1 - ความตั้งใจคือการจับคู่ ISO-8601 โดยที่ Z ที่หายไปหมายถึงเวลาท้องถิ่น (ดังนั้น Chrome จึงตรงกับ ES5.1, Firefox และ IE ตรงกับ ISO-8601)
sinelaw

@sinelaw: ขอบคุณสำหรับการตรวจสอบประเด็นนั้นเพิ่มเติม อย่างไรก็ตามไม่ว่าข้อมูลจำเพาะจะเป็นอย่างไรเบราว์เซอร์ [เก่า] ยังคงทำมันแตกต่างกัน :-)
Bergi

2
การใช้ Date.Parse กับวันที่ใหม่อย่างผิดปกติแก้ไขปัญหาที่ฉันพบโดยที่ Chrome จะแปลงวันที่เป็นเขตเวลาท้องถิ่นแทนที่จะปฏิบัติตามที่มีอยู่แล้วในเขตเวลาท้องถิ่น
KingOfHypocrites

1
@ KingOfHypocrites ที่เป็นบิตแปลกเป็นโทรคอนสตรัควันกับสตริงควรจะเป็นเช่นเดียวกับการใช้Date.parse
RobG

4

ฉันพบสิ่งหนึ่งที่นี่ ดูเหมือนว่าคอนโซลผู้ตรวจสอบ Firefox ดั้งเดิมอาจมีข้อบกพร่อง: ถ้าฉันเรียกใช้ "วันที่ใหม่ ()" ในตัวตรวจสอบดั้งเดิมจะแสดงวันที่ที่มีเขตเวลาผิดตำแหน่งที่ตั้ง GMT แต่ใช้คำสั่งเดียวกันใน Firebug Extension Console วันที่ แสดงให้ใช้เขตเวลาที่ถูกต้องของฉัน (GMT-3: 00)


-2

สังเกตเห็นว่า FireFox ไม่ได้ส่งคืนผลลัพธ์เดียวกันกับ Chrome ดูเหมือนว่ารูปแบบที่คุณใช้ใน kendo.toString สำหรับวันที่จะสร้างความแตกต่าง

ผลลัพธ์คอนโซลสุดท้ายคือสิ่งที่ฉันต้องการ:

ป้อนคำอธิบายภาพที่นี่


-3

ลองใช้ moment.js มันเข้ากันได้ดีและคล้ายกันกับเบราว์เซอร์ทั้งหมด มาพร้อมกับตัวเลือกการจัดรูปแบบมากมาย ใช้ช่วงเวลา ('วันที่') รูปแบบ ("") แทนวันที่ใหม่ ('วันที่')

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.