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?


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.


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/ )


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"

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

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
}

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
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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.