2014-09-08 14 views
89

Ten Docs wspomnieć moment.ISO_8601 jako opcja formatowania (od 2.7.0 - http://momentjs.com/docs/#/parsing/special-formats/), ale żadna z tych prac (nawet 2.7.0):Jak sformatować datę jako ISO 8601 w pliku moment.js?

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

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

Jak mogę dostać ISO 8601 from chwili.js?

+0

Jaką wersję momentu używasz? Dokumenty mówią, że stała została dodana w 2.7.0. – joews

+0

@joews 2.7.0. Wyjaśnione w pytaniu. Zobacz moją odpowiedź. Rozgryzłem to. Dokumenty nie są jednak bardzo jasne. – sennett

+0

Tak, wspominają tylko specjalne formaty w kontekście parsowania. Dziwny. – joews

Odpowiedz

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

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

Aktualizacja oparciu o odpowiedź: przez @sennet i komentarz @dvlsg (patrz Fiddle) należy zauważyć że istnieje różnica między format i toISOString. Oba są poprawne, ale proces leżący u ich podstaw różni się. toISOString przekształca się w obiekt Date, ustawia na UTC, a następnie używa macierzystej funkcji prototypowania do wyprowadzenia ISO8601 w UTC z milisekundami (YYYY-MM-DD[T]HH:mm:ss.SSS[Z]). Z drugiej strony, format używa domyślnego formatu (YYYY-MM-DDTHH:mm:ssZ) bez milisekund i zachowuje przesunięcie strefy czasowej.

Otworzyłem issue, ponieważ myślę, że może to prowadzić do nieoczekiwanych wyników.

+0

Zgadzam się z tobą @ Yashua. Myślę, że należy unikać używania "format()", ponieważ nie jest intuicyjne. Również nie sądzę, że funkcja, która po prostu opakowuje rodzimych "toISOString()" powinna istnieć w ogóle. Biorąc to pod uwagę, być może dając nową funkcję, taką jak: "toISO8601()" z opcją zachowania strefy czasowej, a odpowiednia dokumentacja będzie lepsza. –

+1

Jeśli chcesz uzyskać czas utc, ale sformatowany w swój własny sposób, zamiast ISO8601, możesz wykonać następujące czynności: 'moment(). Utc() .format (" OUTPUT_FORMAT ")' – StinkyCat

+0

Przydatny podczas formowania daty w kibana, ale ty nie mają dostępu do JS. – Brice

48

Zastosowanie format bez parametrów:

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

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

+20

Tak, jak na marginesie, te dwie odpowiedzi nie są takie same, mimo że oba spełniają wymagania w formacie ISO. 'date.toISOString()' zachowa milisekundy i użyje utc, 'date.format()' zrzuci milisekundy i użyje lokalnej strefy czasowej (lub przynajmniej takiego zachowania aktualnie dostaję w chrome - http://jsfiddle.net/8gvhL1dz/22/) – dvlsg

+0

Użycie .format() z arabskim ustawieniem narodowym prowadzi raczej do arabskich symboli niż angielskich, co prawdopodobnie jest niepożądane. – user393274

2

Jeśli chcesz tylko datę część (np 2017-06-27) i chcesz go do pracy niezależnie od strefy czasowej, a także w języku arabskim, tutaj jest kod I napisał:

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

również możliwe z wanilią JS

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