Bir tarihi moment.js'de ISO 8601 olarak nasıl biçimlendiririm?


202

Bu dokümanlar moment.ISO_8601bir biçimlendirme seçeneği olarak belirtilmiştir (2.7.0 - http://momentjs.com/docs/#/parsing/special-formats/ ), ancak bunların hiçbiri (2.7.0'dan):

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

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

Moment.js'den nasıl ISO 8601 alabilirim?


Hangi anı kullanıyorsunuz? Dokümanlar sabitin 2.7.0'da eklendiğini söylüyor.
joews

@ 2.7 Haberler. Söz konusu açıklığa kavuşturuldu. Cevabımı gör, anladım. Dokümanlar çok net değil.
sennett

Evet, sadece ayrıştırma bağlamında özel biçimlerden bahsediyorlar. Garip.
joews

2
u deneyebilirsinizmoment().toISOString()
Saahithyan Vigneswaran

Yanıtlar:


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

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

Güncelleme Cevaba göre: @sennet ve @dvlsg tarafından yapılan yoruma (bakınız Fiddle ) formatve ile arasında bir fark olduğu belirtilmelidir toISOString. Her ikisi de doğrudur, ancak altta yatan süreç farklıdır. toISOStringDate nesnesine dönüştürür, UTC olarak ayarlanır ve milisaniye ( YYYY-MM-DD[T]HH:mm:ss.SSS[Z]) ile UTC'de ISO8601 çıktısı almak için yerel Date prototip işlevini kullanır . Öte yandan, milisaniye olmadan formatvarsayılan biçimi ( YYYY-MM-DDTHH:mm:ssZ) kullanır ve saat dilimi uzaklığını korur.

Beklenmedik sonuçlara yol açabileceğini düşündüğüm için bir sorun açtım .


1
Sana katılıyorum @Yashua. Sezgisel olmadığı için "format ()" kullanımından kaçınılması gerektiğini düşünüyorum. Ayrıca sadece yerel "toISOString ()" saran bir işlev hiç var sanmıyorum. Bununla birlikte, belki de "toISO8601 ()" gibi yeni bir işlev vermek, saat dilimini ve uygun bir belgeyi tutma seçeneği ile daha iyi olacaktır.
Greivin López

4
Utc zaman istiyor, ancak ISO8601 yerine kendi yolunuzu biçimlendirmek istiyorsanız, aşağıdakileri yapabilirsiniz:moment().utc().format("OUTPUT_FORMAT")
StinkyCat

Kibana'da tarih oluştururken faydalıdır ancak JS'ye erişiminiz yoktur.
Brice

1
Yerel saat dilimini korumak istiyorsanız kullanın moment().toISOString(true);.
Benny Neugebauer

83

formatParametresiz kullanın :

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

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


32
Yan not olarak, her ikisi de ISO format gereksinimlerini karşılasalar bile, bu iki cevap aynı değildir. date.toISOString()milisaniyeyi koruyacak ve utc date.format()kullanacak, milisaniyeyi düşürecek ve yerel saat diliminizi kullanacaktır (veya en azından şu anda kromda aldığım davranış - jsfiddle.net/8gvhL1dz/22 )
dvlsg

Arapça bir yerel ayar ile .format () kullanılması, İngilizce sembollerden ziyade Arapça sembollere yol açar, bu da istenmeyen bir durumdur.
user393274

toISOString yerel saat diliminizde çıktı almaz - her zaman (sıfır ofseti) UTC'dir.
JoeTidee

11

Vanilla JS ile de mümkündür

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

3
Sadece UTC'de isterseniz, saat dilimi korunmadan.
JoeTidee

8

MongoDB'de tarihleri ​​MongoDB'de saklamak için kullandığınızda, tüm tarihler milisaniyelik ISO verileri olarak depolandığından toISOString () yöntemini kullanmanız gerekir.

moment.format() 

2018-04-17T20:00:00Z

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

2018-04-17T20:00:00.000Z

3

Sadece tarih bölümünü (örn. 2017-06-27) istiyorsanız ve saat dilimi ne olursa olsun ve Arapça da çalışmasını istiyorsanız, yazdığım kod:

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
Bu kod soruya bir çözüm sunabilse de, neden / nasıl çalıştığına dair bağlam eklemek daha iyidir. Bu, gelecekteki kullanıcıların bu bilgileri öğrenmesine ve kendi kodlarına uygulamalarına yardımcı olabilir. Kod açıklandığında, kullanıcılardan upvotes şeklinde olumlu geri bildirimler almanız da olasıdır.
Mart'ta 18:41
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.