Jak sformatować datę jako ISO 8601 w momencie.js?

201

Dokumenty te wspominają moment.ISO_8601o opcji formatowania (od 2.7.0 - http://momentjs.com/docs/#/parsing/special-formats/ ), ale żadna z tych nie działa (nawet 2.7.0):

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

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

Jak mogę uzyskać ISO 8601 z moment.js?

sennett
źródło
Jakiej wersji momentu używasz? Dokumenty mówią, że stała została dodana w wersji 2.7.0.
dołącza
@joews 2.7.0. Wyjaśnione w pytaniu. Zobacz moją odpowiedź, zorientowałem się. Dokumenty nie są jednak bardzo jasne.
sennett
Tak, wspominają tylko o specjalnych formatach w kontekście parsowania. Dziwny.
dołącza
2
możesz spróbowaćmoment().toISOString()
Saahithyan Vigneswaran

Odpowiedzi:

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

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

Aktualizacja Na podstawie odpowiedzi: autorstwa @sennet i komentarza @dvlsg (patrz Fiddle ) należy zauważyć, że istnieje różnica między formati toISOString. Oba są poprawne, ale podstawowy proces różni się. toISOStringkonwertuje na obiekt Date, ustawia na UTC, a następnie używa natywnej funkcji prototypowej Date do wyprowadzania ISO8601 w UTC z milisekundami ( YYYY-MM-DD[T]HH:mm:ss.SSS[Z]). Z drugiej strony formatużywa domyślnego formatu ( YYYY-MM-DDTHH:mm:ssZ) bez milisekund i zachowuje przesunięcie strefy czasowej.

Otworzyłem problem, ponieważ moim zdaniem może on prowadzić do nieoczekiwanych rezultatów.

cyberwombat
źródło
1
Zgadzam się z tobą @Yashua. Myślę, że należy unikać używania „format ()”, ponieważ nie jest to intuicyjne. Nie sądzę też, aby funkcja, która po prostu otacza natywną funkcję „toISOString ()”, powinna w ogóle istnieć. To powiedziawszy, być może nadanie nowej funkcji, takiej jak: „toISO8601 ()” z opcją zachowania strefy czasowej i odpowiedniej dokumentacji, będzie lepsze.
Greivin López
4
Jeśli chcesz czas utc, ale sformatowałeś swój własny sposób, zamiast ISO8601, możesz wykonać następujące czynności:moment().utc().format("OUTPUT_FORMAT")
StinkyCat
Przydatne przy formułowaniu daty w kibanie, ale nie masz dostępu do JS.
Brice
1
Jeśli chcesz zachować lokalną strefę czasową, użyj moment().toISOString(true);.
Benny Neugebauer
83

Użyj formatbez parametrów:

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

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

sennett
źródło
31
Na marginesie, te dwie odpowiedzi nie są takie same, mimo że obie spełniają wymagania formatu ISO. date.toISOString()zachowa milisekundy i użyje utc, date.format()upuści milisekundy i użyje twojej lokalnej strefy czasowej (a przynajmniej takie zachowanie obecnie dostaję w chrome - jsfiddle.net/8gvhL1dz/22 )
dvlsg
Użycie .format () z ustawieniami arabskimi prowadzi do symboli arabskich zamiast angielskich, co prawdopodobnie jest niepożądane.
user393274
Funkcja toISOString nie wyświetla danych w lokalnej strefie czasowej - zawsze znajduje się w UTC (z przesunięciem zera).
JoeTidee
11

Możliwe także z waniliowym JS

new Date().toISOString() // "2017-08-26T16:31:02.349Z"
artnikpro
źródło
3
Tylko jeśli chcesz to w UTC, bez zachowania strefy czasowej.
JoeTidee
8

Kiedy używasz Mongoose do przechowywania dat w MongoDB, musisz użyć toISOString (), ponieważ wszystkie daty są przechowywane jako daty ISO z milisekundami.

moment.format() 

2018-04-17T20:00:00Z

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

2018-04-17T20:00:00.000Z
webmaster
źródło
3

Jeśli chcesz tylko część daty (np. 2017-06-27) i chcesz, aby działała niezależnie od strefy czasowej, a także w języku arabskim, oto kod, który napisałem:

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
}
użytkownik393274
źródło
0
var x = moment();

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

moment("2010-01-01T05:06:07", ["YYYY", moment.ISO_8601]);; // error
document.write(x);
Nishith
źródło
2
Chociaż ten kod może dostarczyć rozwiązania pytania, lepiej jest dodać kontekst wyjaśniający, dlaczego / jak to działa. Może to pomóc przyszłym użytkownikom w nauce i zastosowaniu tej wiedzy do własnego kodu. Prawdopodobnie będziesz mieć pozytywne opinie od użytkowników w postaci pozytywnych opinii, gdy kod zostanie wyjaśniony.
borchvm