ตามค่าเริ่มต้น MomentJS จะแยกวิเคราะห์ตามเวลาท้องถิ่น หากระบุเฉพาะสตริงวันที่ (ไม่มีเวลา) เวลาเริ่มต้นคือเที่ยงคืน
ในรหัสของคุณคุณสร้างวันที่ในท้องถิ่นจากนั้นแปลงเป็นเขตเวลา UTC (อันที่จริงมันทำให้อินสแตนซ์ช่วงเวลาเปลี่ยนเป็นโหมด UTC ) ดังนั้นเมื่อมีการจัดรูปแบบจะถูกเลื่อน (ขึ้นอยู่กับเวลาท้องถิ่นของคุณ) ไปข้างหน้าหรือ ถอยหลัง.
หากเขตเวลาท้องถิ่นคือ UTC + N (N เป็นจำนวนบวก) และคุณแยกวิเคราะห์สตริงวันที่เท่านั้นคุณจะได้รับวันที่ก่อนหน้า
ต่อไปนี้คือตัวอย่างบางส่วนที่จะแสดงให้เห็น (การชดเชยเวลาท้องถิ่นของฉันคือ UTC + 3 ในช่วง DST):
>>> moment('07-18-2013', 'MM-DD-YYYY').utc().format("YYYY-MM-DD HH:mm")
"2013-07-17 21:00"
>>> moment('07-18-2013 12:00', 'MM-DD-YYYY HH:mm').utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 09:00"
>>> Date()
"Thu Jul 25 2013 14:28:45 GMT+0300 (Jerusalem Daylight Time)"
หากคุณต้องการให้สตริงวันที่ - เวลาตีความเป็น UTC คุณควรระบุให้ชัดเจน:
>>> moment(new Date('07-18-2013 UTC')).utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"
หรือตามที่ Matt Johnson กล่าวไว้ในคำตอบของเขาคุณสามารถ ( และน่าจะ ) แยกวิเคราะห์เป็นวันที่ UTC ตั้งแต่แรกโดยใช้moment.utc()
และรวมสตริงรูปแบบเป็นอาร์กิวเมนต์ที่สองเพื่อป้องกันความคลุมเครือ
>>> moment.utc('07-18-2013', 'MM-DD-YYYY').format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"
ในการเปลี่ยนวันที่ UTC เป็นวันที่ท้องถิ่นคุณสามารถใช้local()
วิธีการดังต่อไปนี้:
>>> moment.utc('07-18-2013', 'MM-DD-YYYY').local().format("YYYY-MM-DD HH:mm")
"2013-07-18 03:00"
toString()
หลังจากนั้นformat()
(มันส่งคืนสตริงแล้ว)