Como formato uma data como ISO 8601 no momento.js?

201

Este documento é mencionado moment.ISO_8601como uma opção de formatação (de 2.7.0 - http://momentjs.com/docs/#/parsing/special-formats/ ), mas nenhum deles funciona (mesmo 2.7.0):

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

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

Como posso obter uma ISO 8601 do moment.js?

Sennett
fonte
Qual versão do momento você está usando? Os documentos dizem que a constante foi adicionada no 2.7.0.
joews
@joews 2.7.0. Esclarecido em questão. Veja minha resposta, eu descobri. Os documentos não são muito claros.
sennett
Sim, eles mencionam apenas formatos especiais no contexto da análise. Ímpar.
joews
2
você pode tentar moment().toISOString()
#:

Respostas:

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

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

Atualização Com base na resposta: por @sennet e no comentário por @dvlsg (consulte o Fiddle ), deve-se notar que há uma diferença entre formate toISOString. Ambos estão corretos, mas o processo subjacente é diferente. toISOStringconverte em um objeto Date, define para UTC e usa a função protótipo Date nativa para gerar ISO8601 no UTC com milissegundos ( YYYY-MM-DD[T]HH:mm:ss.SSS[Z]). Por outro lado, formatusa o formato padrão ( YYYY-MM-DDTHH:mm:ssZ) sem milissegundos e mantém o deslocamento do fuso horário.

Abri um problema, pois acho que ele pode levar a resultados inesperados.

cyberwombat
fonte
1
Eu concordo com você @Yashua. Eu acho que o uso de "format ()" deve ser evitado, porque não é intuitivo. Também não acho que uma função que envolva apenas o "toISOString ()" nativo deva existir. Dito isto, talvez dar uma nova função como: "toISO8601 ()" com a opção de manter o fuso horário e uma documentação adequada seja melhor.
Greivin López
4
Se você quiser a hora UTC, mas formatado o seu próprio caminho, em vez de ISO8601, você pode fazer o seguinte:moment().utc().format("OUTPUT_FORMAT")
StinkyCat
Útil ao formatar uma data no kibana, mas você não tem acesso ao JS.
Brice6 /
1
Se você deseja manter o fuso horário local, use moment().toISOString(true);.
Benny Neugebauer
83

Use formatsem parâmetros:

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

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

Sennett
fonte
31
Apenas como uma observação lateral, essas duas respostas não são as mesmas, embora ambas atendam aos requisitos do formato ISO. date.toISOString()manterá os milissegundos e usará utc, date.format()diminuirá os milissegundos e usará o fuso horário local (ou pelo menos, esse é o comportamento que estou recebendo no chrome - jsfiddle.net/8gvhL1dz/22 )
dvlsg
Usar .format () com um código de idioma árabe leva a símbolos árabes em vez de ingleses, o que provavelmente é indesejável.
user393274
O toISOString não é emitido no fuso horário local - ele está sempre no UTC (deslocamento zero).
31419 JoeTidee
11

Também é possível com o vanilla JS

new Date().toISOString() // "2017-08-26T16:31:02.349Z"
artnikpro
fonte
3
Somente se você desejar no UTC, sem manter o fuso horário.
21419 JoeTidee
8

Ao usar o Mongoose para armazenar datas no MongoDB, você precisa usar toISOString () porque todas as datas são armazenadas como datas ISO com milissegundos.

moment.format() 

2018-04-17T20:00:00Z

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

2018-04-17T20:00:00.000Z
webmaster
fonte
3

Se você deseja apenas a parte da data (por exemplo, 27/06/2017) e deseja que ela funcione independentemente do fuso horário e também em árabe, aqui está o código que escrevi:

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
}
user393274
fonte
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
fonte
2
Embora esse código possa fornecer uma solução para a pergunta, é melhor adicionar contexto ao porquê / como ele funciona. Isso pode ajudar os usuários futuros a aprender e aplicar esse conhecimento ao seu próprio código. Também é provável que você tenha um feedback positivo dos usuários na forma de upvotes, quando o código é explicado.
borchvm 18/03