Bagaimana cara memformat tanggal sebagai ISO 8601 di moment.js?


201

Dokumen ini disebutkan moment.ISO_8601sebagai opsi pemformatan (mulai 2.7.0 - http://momentjs.com/docs/#/parsing/special-formats/ ), tetapi tidak satu pun dari pekerjaan ini (bahkan 2.7.0):

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

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

Bagaimana saya bisa mendapatkan ISO 8601 dari moment.js?


Apa versi momen yang Anda gunakan? Dokumen mengatakan bahwa konstanta ditambahkan di 2.7.0.
joews

@ joews 2.7.0. Klarifikasi dalam pertanyaan. Lihat jawaban saya, saya menemukan jawabannya. Namun, dokumen tidak terlalu jelas.
sennett

Ya, mereka hanya menyebutkan format khusus dalam konteks parsing. Aneh.
joews

2
kamu dapat mencobamoment().toISOString()
Saahithyan Vigneswaran

Jawaban:


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

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

Pembaruan Berdasarkan jawaban: oleh @sennet dan komentar oleh @dvlsg (lihat Fiddle ) harus dicatat bahwa ada perbedaan antara formatdan toISOString. Keduanya benar tetapi proses yang mendasarinya berbeda. toISOStringdikonversi ke objek Date, atur ke UTC kemudian gunakan fungsi prototipe Date asli untuk menghasilkan ISO8601 dalam UTC dengan milidetik ( YYYY-MM-DD[T]HH:mm:ss.SSS[Z]). Di sisi lain, formatgunakan format default ( YYYY-MM-DDTHH:mm:ssZ) tanpa milidetik dan pertahankan offset zona waktu.

Saya telah membuka masalah karena saya pikir itu dapat menyebabkan hasil yang tidak terduga.


1
Saya setuju dengan Anda @Yashua. Saya pikir penggunaan "format ()" harus dihindari karena tidak intuitif. Juga saya tidak berpikir fungsi yang hanya membungkus asli "toISOString ()" harus ada sama sekali. Yang sedang berkata, mungkin memberikan fungsi baru seperti: "toISO8601 ()" dengan opsi untuk menjaga zona waktu dan dokumentasi yang tepat akan lebih baik.
Greivin López

4
Jika Anda menginginkan waktu utc, tetapi diformat dengan cara Anda sendiri, alih-alih ISO8601, Anda dapat melakukan hal berikut:moment().utc().format("OUTPUT_FORMAT")
StinkyCat

Bermanfaat saat memformat tanggal di kibana tetapi Anda tidak memiliki akses ke JS.
Brice

1
Jika Anda ingin mempertahankan zona waktu lokal, gunakan moment().toISOString(true);.
Benny Neugebauer

83

Gunakan formattanpa parameter:

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

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


31
Sama seperti catatan tambahan, kedua jawaban ini tidak sama, meskipun keduanya memenuhi persyaratan format ISO. date.toISOString()akan menyimpan milidetik dan menggunakan utc, date.format()akan menjatuhkan milidetik dan menggunakan zona waktu lokal Anda (atau setidaknya, itulah perilaku yang saat ini saya dapatkan di chrome - jsfiddle.net/8gvhL1dz/22 )
dvlsg

Menggunakan .format () dengan lokal Arab mengarah ke simbol-simbol Arab daripada simbol-simbol bahasa Inggris, yang mungkin tidak diinginkan.
user393274

toISOString tidak menghasilkan di zona waktu lokal Anda - itu selalu dalam (offset nol) UTC.
JoeTidee

11

Juga dimungkinkan dengan vanilla JS

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

3
Hanya jika Anda menginginkannya di UTC, tanpa mempertahankan zona waktu.
JoeTidee

8

Ketika Anda menggunakan Mongoose untuk menyimpan tanggal ke dalam MongoDB, Anda perlu menggunakan toISOString () karena semua tanggal disimpan sebagai tanggal ISO dengan milidetik.

moment.format() 

2018-04-17T20:00:00Z

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

2018-04-17T20:00:00.000Z

3

Jika Anda hanya menginginkan bagian tanggal (mis. 2017-06-27), dan Anda ingin itu berfungsi terlepas dari zona waktu dan juga dalam bahasa Arab, berikut adalah kode yang saya tulis:

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
Meskipun kode ini dapat memberikan solusi untuk pertanyaan, lebih baik menambahkan konteks mengapa / cara kerjanya. Ini dapat membantu pengguna di masa depan belajar, dan menerapkan pengetahuan itu ke kode mereka sendiri. Anda juga cenderung mendapat umpan balik positif dari pengguna dalam bentuk upvotes, ketika kode dijelaskan.
borchvm
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.