2014-09-08 22 views
89

Bu dokümanlar (2.7.0 den - http://momentjs.com/docs/#/parsing/special-formats/) bir biçimlendirme seçeneği olarak moment.ISO_8601 söz, ancak bu işin (hatta 2.7.0) yaramazsa:Bir anı, anasistemde ISO 8601 olarak nasıl biçimlendiririm?

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

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

Nasıl alabilirim Moment.js'den ISO 8601 mi? @sennet tarafından ve @dvlsg tarafından açıklama:

+0

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

+0

@joews 2.7.0. Söz konusu açıklandı. Cevabımı görünce çözdüm. Dokümanlar pek net değil. – sennett

+0

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

cevap

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

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

Güncelleme (bkz. Fiddle) not edilmelidir format ve toISOString arasında bir fark vardır. Her ikisi de doğru, ancak temel süreç farklıdır. toISOString bir Date nesnesine dönüştürür, UTC'ye ayarlar ve ardından milisaniye cinsinden (YYYY-MM-DD[T]HH:mm:ss.SSS[Z]) UTC'de ISO8601 çıkışı için yerel Date prototype işlevini kullanır. Diğer yandan, format, milisaniye olmadan varsayılan biçimini (YYYY-MM-DDTHH:mm:ssZ) kullanır ve saat dilimi uzaklığını korur.

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

+0

Sana katılıyorumYashua. Ben sezgisel değil çünkü "format()" kullanımından kaçınılmalıdır düşünüyorum. Ayrıca, "toISOString()" adlı parçayı tamamen saran bir işlevi de düşünmüyorum. Bu söyleniyor, belki de gibi yeni bir işlev veriyor: "toISO8601()" ile zaman dilimi tutmak için ve uygun bir belge daha iyi olacaktır. –

+1

utc zamanını istiyorsanız, ancak ISO8601 yerine kendi yolunuzu biçimlendirdiyseniz, aşağıdakileri yapabilirsiniz: 'moment(). Utc(). Formatı (" OUTPUT_FORMAT ")' – StinkyCat

+0

Kibana'da bir tarih oluşturabilir, ancak siz JS'ye erişiminiz yok. – Brice

48

hiçbir parametrelerle Kullanım format:

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

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

+20

Bir yan not olarak, her ikisi de ISO formatı gereksinimlerini karşılasalar bile aynı değildir. 'date.toISOString()' milisaniye tutar ve utc kullanır, 'date.format()' milisaniye değerini düşürür ve yerel saat diliminizi kullanır (ya da en azından şu anda krom aldığım davranış budur - http://jsfiddle.net/8gvhL1dz/22/) – dvlsg

+0

.format() ile Arapça bir yer işareti kullanmak, muhtemelen istenmeyen olan İngilizceden çok Arapça sembollere yol açar. – user393274

2

sadece tarih kısmını (örneğin 2017/06/27) istiyor ve bunun zaman diliminden bağımsız ve aynı zamanda Arapça çalışmak istiyorsanız, buraya yazdığım kod şudur: Ayrıca

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 
} 
4

mümkün ile vanilya

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