ฉันจะจัดรูปแบบวันที่ในรูปแบบ ISO 8601 ได้ใน moment.js ได้อย่างไร


201

เอกสารนี้พูดถึงmoment.ISO_8601ว่าเป็นตัวเลือกการจัดรูปแบบ (จาก 2.7.0 - http://momentjs.com/docs/#/parsing/special-formats/ ) แต่ไม่มีงานเหล่านี้ (แม้แต่ 2.7.0):

var date = moment();
date.format(moment.ISO_8601); // error
moment.format(date, moment.ISO_8601); // error

( http://jsfiddle.net/b3d6uy05/1/ )

ฉันจะได้รับ ISO 8601 จาก moment.js ได้อย่างไร


คุณกำลังใช้ช่วงเวลาเวอร์ชันใด เอกสารบอกว่ามีการเพิ่มค่าคงที่ใน 2.7.0
joews

@joews 2.7.0 ชี้แจงในคำถาม ดูคำตอบของฉันฉันคิดออก เอกสารไม่ชัดเจนอย่างมากแม้ว่า
sennett

ใช่พวกเขาพูดถึงรูปแบบพิเศษในบริบทของการแยกวิเคราะห์ แปลก
joews

2
คุณสามารถลองmoment().toISOString()
Saahithyan Vigneswaran

คำตอบ:


339
moment().toISOString(); // or format() - see below

http://momentjs.com/docs/#/displaying/as-iso-string/

อัปเดต จากคำตอบ: โดย @sennet และแสดงความคิดเห็นโดย @dvlsg (ดูซอ ) ก็ควรจะตั้งข้อสังเกตว่ามีความแตกต่างระหว่างและformat toISOStringทั้งสองถูกต้อง แต่กระบวนการพื้นฐานแตกต่างกัน toISOStringแปลงเป็นวัตถุวันที่ตั้งค่าเป็น UTC จากนั้นใช้ฟังก์ชันต้นแบบวันที่ดั้งเดิมเพื่อส่งออก ISO8601 ใน UTC ด้วยมิลลิวินาที ( YYYY-MM-DD[T]HH:mm:ss.SSS[Z]) ในทางกลับกันให้formatใช้รูปแบบเริ่มต้น ( YYYY-MM-DDTHH:mm:ssZ) โดยไม่มีมิลลิวินาทีและดูแลการชดเชยเขตเวลา

ฉันเปิดปัญหาเนื่องจากฉันคิดว่าสามารถนำไปสู่ผลลัพธ์ที่ไม่คาดคิดได้


1
ฉันเห็นด้วยกับคุณ @Yashua ฉันคิดว่าควรหลีกเลี่ยงการใช้ "format ()" เพราะไม่เข้าใจง่าย นอกจากนี้ฉันไม่คิดว่าฟังก์ชั่นที่เพิ่งจะตัด "toISOString ()" ดั้งเดิมไว้ควรมีอยู่จริง ที่ถูกกล่าวว่าอาจให้ฟังก์ชั่นใหม่เช่น: "toISO8601 ()" พร้อมตัวเลือกในการรักษาเขตเวลาและเอกสารที่เหมาะสมจะดีกว่า
Greivin López

4
หากคุณต้องการเวลา utc แต่จัดรูปแบบของคุณเองแทน ISO8601 คุณสามารถทำสิ่งต่อไปนี้:moment().utc().format("OUTPUT_FORMAT")
StinkyCat

มีประโยชน์เมื่อสร้างวันที่ในคิบานะ แต่คุณไม่มีสิทธิ์เข้าถึง JS
Brice

1
moment().toISOString(true);หากคุณต้องการที่จะรักษาเขตเวลาท้องถิ่นใช้
Benny Neugebauer

83

ใช้formatโดยไม่มีพารามิเตอร์:

var date = moment();
date.format(); // "2014-09-08T08:02:17-05:00"

( http://jsfiddle.net/8gvhL1dz/ )


31
เช่นเดียวกับบันทึกด้านข้างคำตอบสองข้อนี้ไม่เหมือนกันแม้ว่าทั้งคู่จะตอบสนองความต้องการรูปแบบ ISO date.toISOString()จะเก็บมิลลิวินาทีและใช้ utc date.format()จะลดมิลลิวินาทีและใช้เขตเวลาท้องถิ่นของคุณ (หรืออย่างน้อยนั่นคือพฤติกรรมที่ฉันกำลังได้รับใน Chrome ในปัจจุบัน - jsfiddle.net/8gvhL1dz/22 )
dvlsg

การใช้. format () กับโลแคลอาราบิคจะนำไปสู่สัญลักษณ์ภาษาอารบิกมากกว่าภาษาอังกฤษซึ่งอาจไม่เป็นที่ต้องการ
user393274

toISOS การไม่ส่งออกในเขตเวลาท้องถิ่นของคุณ - มันจะอยู่ใน (ออฟเซ็ตเป็นศูนย์) UTC เสมอ
JoeTidee

11

เป็นไปได้ด้วยวานิลลา JS

new Date().toISOString() // "2017-08-26T16:31:02.349Z"

3
เฉพาะในกรณีที่คุณต้องการใน UTC โดยไม่ต้องบำรุงรักษาเขตเวลา
JoeTidee

8

เมื่อคุณใช้ Mongoose เพื่อเก็บวันที่ลงใน MongoDB คุณจะต้องใช้ toISOString () เพราะวันที่ทั้งหมดจะถูกเก็บไว้เป็น ISOdates ด้วย miliseconds

moment.format() 

2018-04-17T20:00:00Z

moment.toISOString() -> USE THIS TO STORE IN MONGOOSE

2018-04-17T20:00:00.000Z

3

หากคุณต้องการส่วนของวันที่ (เช่น 2017-06-27) และคุณต้องการให้ทำงานโดยไม่คำนึงถึงเขตเวลาและในภาษาอาหรับนี่คือรหัสที่ฉันเขียน:

function isoDate(date) {
    if (!date) {
        return null
    }
    date = moment(date).toDate()

    // don't call toISOString because it takes the time zone into
    // account which we don't want.  Also don't call .format() because it
    // returns Arabic instead of English

    var month = 1 + date.getMonth()
    if (month < 10) {
        month = '0' + month
    }
    var day = date.getDate()
    if (day < 10) {
        day = '0' + day
    }
    return date.getFullYear() + '-' + month + '-' + day
}

0
var x = moment();

//date.format(moment.ISO_8601); // error

moment("2010-01-01T05:06:07", ["YYYY", moment.ISO_8601]);; // error
document.write(x);

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