Converta uma data ISO para o formato de data aaaa-mm-dd em JavaScript

109

Como posso obter uma data com o formato aaaa-mm-dd a partir de uma data ISO 8601 ?

Minha data 8601 é

2013-03-10T02:00:00Z

Como posso obter o seguinte?

2013-03-10
Neeraj
fonte
2
Você realmente tentou fazer isso? Esta não é uma pergunta nova, ela foi respondida várias vezes.
bPratik
14
date.split("T")[0]faria
Aravindh Gopi

Respostas:

100

Tente isto

date = new Date('2013-03-10T02:00:00Z');
date.getFullYear()+'-' + (date.getMonth()+1) + '-'+date.getDate();//prints expected format.

Atualizar:-

Conforme indicado nos comentários, estou atualizando a resposta para imprimir zeros à esquerda para data e mês, se necessário.

date = new Date('2013-08-03T02:00:00Z');
year = date.getFullYear();
month = date.getMonth()+1;
dt = date.getDate();

if (dt < 10) {
  dt = '0' + dt;
}
if (month < 10) {
  month = '0' + month;
}

console.log(year+'-' + month + '-'+dt);

Mritunjay
fonte
17
Observe, eu não acho que isso imprimirá um zero à esquerda para o dia ou mês
user3413723
2
Concorde com @ user3413723, isto não responde à pergunta porque remove o 0 inicial, portanto, não atende aos requisitos do formato AAAA-MM-DD
James Murphy
Funcionando bem @Mritunjay
Ravi Delixan
Isso é mais longo e mais sujeito a erros de digitação em comparação com a resposta do DriveByPoster. Mas não vou dar um downvote porque é mais agnóstico de linguagem. Ele simplesmente não usa as ferramentas simples à nossa disposição.
RoboticRenaissance de
senhor pode me dizer como passar 2013 3 1 este formato data em nova data (data)
Kapil soni
143

Basta cortar a corda:

var date = new Date("2013-03-10T02:00:00Z");
date.toISOString().substring(0, 10);

Ou se você precisar apenas de data fora da string.

var strDate = "2013-03-10T02:00:00Z";
strDate.substring(0, 10);
DriveByPoster
fonte
3
Acho que esta é a solução mais fácil e elegante de todas, mas há alguma desvantagem para isso?
Aida_Aida
30
@Aida_Aida O único problema em que consigo pensar é que se o seu código lida com o tempo de escala geológica, pelo menos 8.000 anos no futuro, seu código pode quebrar porque o formato estará YYYYY-MM-DDno ano 10.000. Para evitar isso, você pode dividir no Tpersonagem em vez disso. (Consulte en.wikipedia.org/wiki/Year_10,000_problem )
apsillers
9
Desta forma, não lidará com fusos horários corretamente, pois o ISOString é UTC, mas o objeto Date é local. Você tem que levar isso em consideração.
Guillaume F.
3
@GuillaumeF. uma consideração importante, mas está em conformidade com os requisitos do OP
jamesjansson
Não consigo entender por que a string deve ser analisada em uma data. A opção substring parece ser a resposta mais simples.
RobG de
46

Você pode verificar Moment.js , Luxon , date-fns ou Day.js para uma boa manipulação de datas.

Ou apenas extraia a primeira parte de sua string ISO, ela já contém o que você deseja. Aqui está um exemplo dividindo em T:

"2013-03-10T02:00:00Z".split("T")[0] // "2013-03-10"
antoine129
fonte
15

Moment.js cuidará da formatação de datas para você. Aqui está como incluí-lo por meio de uma tag JavaScript e, em seguida, um exemplo de como usar Moment.js para formatar uma data.

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment.min.js"></script>

moment("2013-03-10T02:00:00Z").format("YYYY-MM-DD") // "2013-03-10"
Harris
fonte
Embora este snippet de código possa resolver a questão, incluir uma explicação realmente ajuda a melhorar a qualidade de sua postagem. Lembre-se de que você está respondendo à pergunta para leitores no futuro e essas pessoas podem não saber os motivos de sua sugestão de código. Tente também não sobrecarregar seu código com comentários explicativos, pois isso reduz a legibilidade do código e das explicações!
Adeus StackExchange
2
momenté uma biblioteca bem grande para usar apenas para formatação. Em vez disso, use date-fns, que é muito menor em tamanho e oferece a mesma funcionalidade.
Hozefa
@Hozefa, então responda à pergunta do OP com sua solução.
Harris,
1
@Harris - fez o trabalho sem problemas!
HadidAli
Eu gostaria que o momento tivesse alguma função como .toISODateString(), porque é um caso muito frequente ...
Lev Lukomsky
12

Isso é o que eu faço apenas para conseguir um encontro:

let isoDate = "2013-03-10T02:00:00Z";

alert(isoDate.split("T")[0]);

Aravindh Gopi
fonte
2
Esta é a primeira resposta a realmente propor a ideia de split () como resposta, tanto quanto eu posso dizer e eu gosto dessa solução para o esforço vs confiabilidade vs fator de eficácia embora eu use moment () em todos os lugares que puder.
rainabba
1
toISOString usa UTC, que produzirá a data local errada para o período de diferença de fuso horário local a partir da meia-noite. - RobG
Michael Dimmitt
9

Moment.js é uma biblioteca bem grande para ser usada em um único caso de uso. Eu recomendo usar em seu date-fnslugar. Ele oferece basicamente a maioria das funcionalidades do Moment.js com um tamanho de pacote muito menor e muitos formatting options.

import format from 'date-fns/format'
format('2013-03-10T02:00:00Z', 'YYYY-MM-DD'); // 2013-03-10, YYYY-MM-dd for 2.x

Uma coisa a notar é que, como é o formato de hora ISO 8601 , o navegador geralmente converte a hora UTC para o fuso horário local. Embora este seja um caso de uso simples, onde você provavelmente pode fazer '2013-03-10T02:00:00Z'.substring(0, 10);.

Para conversões mais complexas date-fnsé o caminho a percorrer.

Hozefa
fonte
6

let isoDate = "2013-03-10T02:00:00Z";
var d = new Date(isoDate);
d.toLocaleDateString('en-GB'); // dd/mm/yyyy
d.toLocaleDateString('en-US'); // mm/dd/yyyy

Ammar H Alshaar
fonte
d.toLocaleDateString ('en-GB'); Funciona como um encanto. Ótima resposta!
Donald Shahini
5

Usar:

new Date().toISOString().substring(0, 10);
Ankita
fonte
4

Isso produzirá a data no formato AAAA-MM-DD:

let date = new Date();
date = date.toISOString().slice(0,10);
sebhs
fonte
Não sei por que isso não está recebendo mais votos, funcionou perfeitamente e respondeu à pergunta com o mínimo de esforço
Wolfiebae
4

Passe sua data no objeto data:

var d = new Date('2013-03-10T02:00:00Z');
d.toLocaleDateString().replace(/\//g, '-');
rk rk
fonte
1
toLocaleDateString () fornecerá no formato "/". Não no formato "-".
TechCrunch
Você pode usar o acima, substituindo "/" por "-". Embora não seja o mais elegante se toLocaleDateString alguma vez mudar
James Murphy,
O resultado de toLocaleDateString não é consistente para todos os usuários, portanto, pode não produzir o resultado exigido pelo OP.
RobG de
4

Para todos os que estão usando divisão, fatia e outras tentativas baseadas em string para obter a data, você pode se preparar para falhas relacionadas ao fuso horário!

Uma ISO-String tem Zulu-Timezone e uma data de acordo com este fuso horário, o que significa que pode usar uma data um dia anterior ou posterior ao fuso horário real, que você deve levar em consideração na sua cadeia de transformação.

Veja este exemplo:

const timeZoneRelatedDate = new Date(2020, 0, 14, 0, 0);

console.log(timeZoneRelatedDate.toLocaleDateString(
    'ja-JP', 
    {
      year: 'numeric',
      month: '2-digit',
      day: '2-digit'
    }
).replace(/\//gi,'-'));

// RESULT: "2020-01-14"

console.log(timeZoneRelatedDate.toISOString());

// RESULT: "2020-01-13T23:00:00.000Z" (for me in UTC+1)

console.log(timeZoneRelatedDate.toISOString().slice(0,10));

// RESULT: "2020-01-13"
Jook
fonte
3

Se você tiver um objeto de data:

let date = new Date()
let result = date.toISOString().split`T`[0]

console.log(result)

ou

let date = new Date()
let result = date.toISOString().slice(0, 10)

console.log(result)

Илья Зеленько
fonte
1
toISOString usa UTC, o que produzirá a data local errada para o período de diferença de fuso horário local a partir da meia-noite.
RobG de
1

Para ampliar a solução de rk rk : Caso queira que o formato inclua a hora, você pode adicionar o toTimeString()à sua string e, em seguida, remover a parte GMT, da seguinte maneira:

var d = new Date('2013-03-10T02:00:00Z');
var fd = d.toLocaleDateString() + ' ' + d.toTimeString().substring(0, d.toTimeString().indexOf("GMT"));
Airwavezx
fonte
0

Eu usei este:

HTMLDatetoIsoDate(htmlDate){
  let year = Number(htmlDate.toString().substring(0, 4))
  let month = Number(htmlDate.toString().substring(5, 7))
  let day = Number(htmlDate.toString().substring(8, 10))
  return new Date(year, month - 1, day)
}

isoDateToHtmlDate(isoDate){
  let date = new Date(isoDate);
  let dtString = ''
  let monthString = ''
  if (date.getDate() < 10) {
    dtString = '0' + date.getDate();
  } else {
    dtString = String(date.getDate())
  }
  if (date.getMonth()+1 < 10) {
    monthString = '0' + Number(date.getMonth()+1);
  } else {
    monthString = String(date.getMonth()+1);
  }
  return date.getFullYear()+'-' + monthString + '-'+dtString
}

Fonte: http://gooplus.fr/en/2017/07/13/angular2-typescript-isodate-to-html-date/

Alan
fonte
0

    var d = new Date("Wed Mar 25 2015 05:30:00 GMT+0530 (India Standard Time)");
    alert(d.toLocaleDateString());

Abilash Raghu
fonte
0
let dt = new Date('2013-03-10T02:00:00Z');
let dd = dt.getDate();
let mm = dt.getMonth() + 1;
let yyyy = dt.getFullYear();

if (dd<10) {
    dd = '0' + dd;
}
if (mm<10) {
    mm = '0' + mm;
}
return yyyy + '-' + mm + '-' + dd;
Vazamento de memória
fonte
0

Uma versão melhor da resposta de @Hozefa .

Se você date-fnsinstalou, você pode usar a função formatISO

const date = new Date(2019, 0, 2)
import { formatISO } from 'date-fns'
formatISO(date, { representation: 'date' }) // '2019-01-02' string
asiniy
fonte
-4

Use o código abaixo. É útil para você.

let currentDate = new Date()
currentDate.toISOString()
Mohammad Bilal
fonte