เหตุใดวันหยุดจึงเพิ่มขึ้น 1 วันและชั่วโมงจึงปิดใน mor ISO 8601 ใน Moment js

ด้วยสตริง ISO 8601 ฉันใช้ Moment js และกำลังทำ moment("2014-05-08T00:20:40Z").format("HH:mm:ss") เพื่อรับเวลาสตริงที่ "00:20:40" แต่


person Community    schedule 28.09.2016    source แหล่งที่มา
comment
z ในการประทับเวลาหมายถึง UTC ดังนั้นฉันเดาได้ดีที่สุดว่าคุณไม่ได้อยู่ในเขตเวลา UTC ดังนั้นจึงจัดรูปแบบการประทับเวลาให้เป็นเขตเวลาของคุณ   -  person Derek Pollard    schedule 28.09.2016


คำตอบ (1)


วันที่ ISO ของคุณคือวันที่ UTC นั่นคือสิ่งที่ Z ในตอนท้ายหมายถึง คุณอยู่ 7 โซนเวลาทางตะวันตกของ UTC

เวลาที่คุณเริ่มต้นคือ 20 นาทีหลังเที่ยงคืนของวันที่ 8 หากคุณรันโค้ดในปารีส ประเทศฝรั่งเศส คุณจะได้คำตอบที่ถูกต้อง (โดยไม่สนใจการปรับ "เวลาฤดูร้อน") อย่างไรก็ตาม เนื่องจากคุณอยู่ 7 โซนเวลาทางตะวันตก คุณจะเป็นเวลา 5:20 น. ในช่วงบ่าย และคุณยังอยู่ในวันตามปฏิทินก่อนหน้า

มองในแง่หนึ่ง ไม่มีอะไรจะ "แก้ไข" ได้ เวอร์ชันเวลาท้องถิ่นตามสถานที่ที่คุณอยู่จะแสดงเวลาจุดเดียวกันกับเวลา ISO UTC ดั้งเดิม ทุกอย่างทำงานได้อย่างถูกต้อง การแสดงค่าวันที่เริ่มต้นอยู่ในเวลา ท้องถิ่น ออบเจ็กต์ดั้งเดิม Date ใน JavaScript มี API เพื่อเข้าถึงส่วนประกอบตามเงื่อนไข UTC หากคุณต้องการไปทางนั้น

คุณสามารถใช้ .toISOString() หากคุณต้องการรับสตริง ISO ดั้งเดิมกลับมา:

moment("2014-05-08T00:20:40Z").toISOString()

หรือคุณสามารถรวมแท็กโซนเวลาในสตริงรูปแบบของคุณ:

moment("2014-05-08T00:20:40Z").format("HH:mm:ss zz")

(โปรดทราบว่า "z" ในสตริงรูปแบบไม่ได้มีความหมายเหมือนกับ "Z" ในเวลา ISO เป็นเพียงอักขระพิเศษในการจัดรูปแบบจากอักษรตัวแรกของคำว่า "zone" ในสตริง ISO เป็นตัวอักษรตัวแรกของคำว่า "ศูนย์" และหมายความว่าเวลาอยู่ที่ศูนย์ชดเชยจากเวลา UTC บางคนเรียกมันว่า "เวลาซูลู" เพราะ "Z")

person Pointy    schedule 28.09.2016
comment
ถูกต้อง แต่ยังดู: maggiepint.com/2016 /05/14/moment-js-shows-the-wrong-date. หรือคุณอาจจำเป็นต้องใช้ฟังก์ชันจากโรงงานที่ถูกต้องสำหรับกรณีการใช้งานของคุณ - person Maggie Pint; 28.09.2016
comment
@MaggiePint นั่นเป็นบทความที่ยอดเยี่ยม เป็นการยากที่จะบอกในคำถาม SO เช่นนี้เสมอว่าบริบทที่ใหญ่กว่าคืออะไร ตัวอย่างเช่นวันที่ ISO UTC นั้นมาจากไหนตั้งแต่แรก? อาจเป็นไปได้ว่าวิธีแก้ปัญหาที่ง่ายที่สุดคือการแก้ไขการจัดรูปแบบบนเซิร์ฟเวอร์ และถึงอย่างนั้นก็ขึ้นอยู่กับความหมายของแอปพลิเคชัน อย่างไรก็ตาม ขอบคุณ นั่นเป็นสิ่งดีๆ และฉันจะพยายามอย่าลืมลิงก์ไปยังลิงก์นั้น (อย่างที่คุณบอก สิ่งเหล่านี้เกิดขึ้นตลอดเวลา!) - person Pointy; 28.09.2016