Formate a data do JavaScript como aaaa-mm-dd


382

Eu tenho uma data com o formato Sun May 11,2014. Como posso convertê-lo para o 2014-05-11JavaScript?

function taskDate(dateMilli) {
    var d = (new Date(dateMilli) + '').split(' ');
    d[2] = d[2] + ',';

    return [d[0], d[1], d[2], d[3]].join(' ');
}

var datemilli = Date.parse('Sun May 11,2014');
console.log(taskDate(datemilli));

O código acima me fornece o mesmo formato de data sun may 11,2014,. Como posso consertar isso?


7
Duvido que o código acima ofereça algo além de um erro de sintaxe.
Plalx

Considere realmente usar uma biblioteca como Moment.js. Ele vai formatar no resultado desejado :)
Ankur

5
Por que usar uma biblioteca quando cinco linhas de código podem fazer o trabalho? @Ankur
Black Mamba


Relacionado: O que são seqüências de data e hora válidas em JavaScript? Observe que "Sun May 11,2014" não é uma sequência de datas válida e a análise pode falhar em alguns navegadores.
str

Respostas:


524

Você pode fazer:

function formatDate(date) {
    var d = new Date(date),
        month = '' + (d.getMonth() + 1),
        day = '' + d.getDate(),
        year = d.getFullYear();

    if (month.length < 2) 
        month = '0' + month;
    if (day.length < 2) 
        day = '0' + day;

    return [year, month, day].join('-');
}

Exemplo de uso:

alert(formatDate('Sun May 11,2014'));

Resultado:

2014-05-11

Demo no JSFiddle: http://jsfiddle.net/abdulrauf6182012/2Frm3/


11
Realmente várias declarações de variáveis ​​na mesma instrução? stackoverflow.com/questions/694102/…
bhspencer

8
@ Fuser97381 Várias declarações de variáveis ​​na mesma instrução são mais do que apenas uma preferência de estilo estético. É uma prática perigosa. Se você inadvertidamente falhar, adicione uma vírgula após cada declaração e acaba criando variáveis ​​globais. Não é algo que deva ser encorajado no que pode se tornar a resposta canônica para uma pergunta.
Bhspencer 31/08/2015

6
'use strict'; @bhspencer
Vix

3
A reformatação de uma sequência de datas não deve depender da análise bem-sucedida de sequências não padrão pelo analisador interno. Dado o formato OP, ele pode ser reformatado em menos código sem usar uma Data.
RobG

Como incrementar mais 30 dias no intervalo de 1 a 31?
Steve Angello

456

Basta aproveitar o toISOStringmétodo interno que leva sua data para o formato ISO 8601:

yourDate.toISOString().split('T')[0]

Onde yourDate é seu objeto de data.

Edit: algum cara escreveu isso para lidar com o fuso horário nos comentários:

const offset = yourDate.getTimezoneOffset()
yourDate = new Date(yourDate.getTime() + (offset*60*1000))
return yourDate.toISOString().split('T')[0]

239
CUIDADO com esse método, pois ele primeiro converte a data em UTC. Se você estiver no fuso horário + e sua parte do tempo for cedo, poderá reverter um dia. Como alternativa, se você estiver em um fuso horário e sua parte do tempo estiver atrasada, poderá avançar um dia.
Luke Baulch 13/09/2015

4
Tente isto:new Date(yourDateStr).toISOString().split('T')[0]
exbuddha 12/02

24
const offset = yourDate.getTimezoneOffset(); yourDate = new Date(yourDate.getTime() + (offset*60*1000)); yourDate.toISOString().split('T')[0] Isto deve resolver o problema de fuso horário
mjwrazor

5
now.toISOString().substring(0,10); Esta é uma alternativa mais limpa, uma vez que lembra que YYYY-MM-DDsão os primeiros caracteres dez do formato completo iso
Gutimore

4
Nota: usando a solução útil comentada por @mjwrazor, eu tive que subtrair em vez de adicionar o deslocamento para obter a data correta (altere + (offsetpara a - (offset)
rococo

135

Eu uso dessa maneira para obter a data no formato aaaa-mm-dd :)

var todayDate = new Date().toISOString().slice(0,10);

14
Como você lida com a mudança de data por dia, como mencionado aqui por @Luke_Baulch?
Malvineous 10/09/16

7
Você pode fazer isso: var todayDate = new Date (); todayDate.setMinutes (todayDate.getMinutes () - todayDate.getTimezoneOffset ()); todayDate.toISOString (). slice (0,10); Isso deve ajudar a evitar o problema do UTC.
Fernando Aguilar

11
@FernandoAguilar Uma dúvida, porém, como sabemos que precisamos subtrair o deslocamento ou adicioná-lo?
whyAto8

var todayDate = new Date(2018, 3 - 1, 26); todayDate.toISOString().slice(0, 10);me dá "2018-03-25". Em outro sistema var todayDate = new Date(2018, 3 - 1, 26, 17, 0, 0); todayDate.toISOString().slice(0, 10);me dá "2018-03-27".
Salman A

2
Nem sempre funciona. Às vezes, subtrai um dia devido à conversão do UTC.
NickG 22/05/19

110

A maneira mais simples de converter sua data para o formato aaaa-mm-dd, é fazer o seguinte:

var date = new Date("Sun May 11,2014");
var dateString = new Date(date.getTime() - (date.getTimezoneOffset() * 60000 ))
                    .toISOString()
                    .split("T")[0];

Como funciona:

  • new Date("Sun May 11,2014")converte a sequência "Sun May 11,2014"em um objeto de data que representa a hora Sun May 11 2014 00:00:00em um fuso horário com base na localidade atual (configurações do sistema host)
  • new Date(date.getTime() - (date.getTimezoneOffset() * 60000 ))converte sua data em um objeto de data que corresponde à hora Sun May 11 2014 00:00:00no UTC (hora padrão) subtraindo o deslocamento do fuso horário
  • .toISOString() converte o objeto de data em uma string ISO 8601 2014-05-11T00:00:00.000Z
  • .split("T") divide a string em array ["2014-05-11", "00:00:00.000Z"]
  • [0] pega o primeiro elemento dessa matriz

Demo

var date = new Date("Sun May 11,2014");
var dateString = new Date(date.getTime() - (date.getTimezoneOffset() * 60000 ))
                    .toISOString()
                    .split("T")[0];

console.log(dateString);


20
Ninguém mais está horrorizado que esta seja a maneira mais simples?
gap

.toISOString () não funciona corretamente com horário de verão.
Idéias de Joe

2
@ JoeDevmon: Não vejo como isso é relevante aqui. O - (date.getTimezoneOffset() * 60000 )bit deve eliminar as diferenças de fuso horário, incluindo o impacto do horário de verão.
John Slegers

2
@JohnSlegers era o que eu estava pensando, mas ainda estava recebendo o dia anterior em alguns casos. Refatorei e seu exemplo funciona agora. Eu devo ter tido uma data estranha ou algo assim. Obrigado por continuar e apontar isso. +1 👍
Ideias de Joe

2
Pesquisei alta e baixa em SO e em outros sites para encontrar a melhor maneira de lidar com problemas de fuso horário com datas em JS e, sem dúvida, essa é de longe a mais fácil e a melhor. Obrigado!
HartleySan

34
format = function date2str(x, y) {
    var z = {
        M: x.getMonth() + 1,
        d: x.getDate(),
        h: x.getHours(),
        m: x.getMinutes(),
        s: x.getSeconds()
    };
    y = y.replace(/(M+|d+|h+|m+|s+)/g, function(v) {
        return ((v.length > 1 ? "0" : "") + eval('z.' + v.slice(-1))).slice(-2)
    });

    return y.replace(/(y+)/g, function(v) {
        return x.getFullYear().toString().slice(-v.length)
    });
}

Resultado:

format(new Date('Sun May 11,2014'), 'yyyy-MM-dd')
"2014-05-11

11
Eu gosto da flexibilidade adicional que esta solução fornece sobre as outras respostas a esta pergunta. Não testei completamente isso, mas para o formato que eu desejava (por exemplo, "aaaa-MM-dd hh: mm: ss"), funciona da maneira esperada.
porcus

3
Você poderia evitar tudo facilmente eval.
Salman A

3
aqui está uma versão que evita o eval e comentários melhor jsfiddle.net/8904cmLd/2
m1m1k

2
Eu me beneficiei dessa resposta. Eu substituí essa linha pela declaração eval parareturn ((v.length > 1 ? "0" : "") + z[v.slice(-1)]).slice(-2);
JesusIsMyDriver.dll 10/10

26

Uma combinação de algumas das respostas:

var d = new Date(date);
date = [
  d.getFullYear(),
  ('0' + (d.getMonth() + 1)).slice(-2),
  ('0' + d.getDate()).slice(-2)
].join('-');

Eu gosto da solução da melhor maneira - fácil de ler e não depende, toISOString()e as possíveis falhas de fuso horário com o uso dessa função.
matt.fc 12/05/19

este é o primeiro que não faz meu cérebro doer.
ckapilla 12/04

22

Se você não tem nada contra o uso de bibliotecas, basta usar a biblioteca Moments.js da seguinte forma:

var now = new Date();
var dateString = moment(now).format('YYYY-MM-DD');

var dateStringWithTime = moment(now).format('YYYY-MM-DD HH:mm:ss');
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>


Solução legal, mas é um pacote de 300kb
Adam

13

Simplesmente use isto:

var date = new Date('1970-01-01'); // Or your date here
console.log((date.getMonth() + 1) + '/' + date.getDate() + '/' +  date.getFullYear());

Simples e doce;)


4
o preenchimento não existe para o formato de 2 letras. mostrará um dígito se a data ou o mês for menor que 10, por isso não será possível usá-lo diretamente.
precisa saber é o seguinte

sim, mas isso pode ser conseguido simplesmente usando javascript, é totalmente sua exigência, acho que sim, não é? @YatenderSingh
Pardeep Jain

4
sim correto, mas verificar o título de pergunta "aaaa-mm-dd" formato que quiser :)
Yatender Singh

var old_date = nova data (data); var new_date = old_date.getFullYear () + '-' + (old_date.getMonth () + 1) + '-' + old_date.getDate ()
Sitti Munirah Abdul Razak

11
Ótimo. Funcionou e foi simples e conciso!
Waleed93 23/04

12

toISOString()assume que sua data é hora local e a converte em UTC. Você receberá uma sequência de datas incorreta.

O método a seguir deve retornar o que você precisa.

Date.prototype.yyyymmdd = function() {         

    var yyyy = this.getFullYear().toString();                                    
    var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based         
    var dd  = this.getDate().toString();             

    return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]);
};

Fonte: https://blog.justin.kelly.org.au/simple-javascript-function-to-format-the-date-as-yyyy-mm-dd/


9

Recupere ano, mês e dia e depois junte-os. Direto, simples e preciso.

function formatDate(date) {
    var year = date.getFullYear().toString();
    var month = (date.getMonth() + 101).toString().substring(1);
    var day = (date.getDate() + 100).toString().substring(1);
    return year + "-" + month + "-" + day;
}

//Usage example:
alert(formatDate(new Date()));


9

Você pode usar toLocaleDateString('fr-CA')no Dateobjeto

console.log(new Date('Sun May 11,2014').toLocaleDateString('fr-CA'));

Também descobri que esses locais dão o resultado correto nessa lista de locais. Lista de todos os locais e seus códigos de acesso?

'en-CA'
'fr-CA'
'lt-LT'
'sv-FI'
'sv-SE'


Alguma idéia de por que isso funciona? O formato ISO é apenas o padrão ou esses locais realmente usam esse formato? Se for o primeiro, eu ficaria preocupado que isso pudesse mudar inesperadamente no futuro.
jymbob 25/02

Isso não está funcionando com o NodeJS fora do navegador.
Donato

@ jymbob Eu acho que esses locais realmente usam esses formatos. Cheguei à mesma resposta
consultando

5

Para considerar também o fuso horário, esse one-liner deve ser bom sem nenhuma biblioteca:

new Date().toLocaleString("en-IN", {timeZone: "Asia/Kolkata"}).split(',')[0]

5

Você pode tentar isso: https://www.npmjs.com/package/timesolver

npm i timesolver

Use-o no seu código:

const timeSolver = require('timeSolver');
const date = new Date();
const dateString = timeSolver.getString(date, "YYYY-MM-DD");

Você pode obter a sequência de datas usando este método:

getString

4

Nenhuma dessas respostas me satisfez. Eu queria uma solução de plataforma cruzada que me desse o dia no fuso horário local sem usar nenhuma biblioteca externa.

Isto é o que eu vim com:

function localDay(time) {
  var minutesOffset = time.getTimezoneOffset()
  var millisecondsOffset = minutesOffset*60*1000
  var local = new Date(time - millisecondsOffset)
  return local.toISOString().substr(0, 10)
}

Isso deve retornar o dia da data, no formato AAAA-MM-DD, no fuso horário em que a data faz referência.

Então, por exemplo, localDay(new Date("2017-08-24T03:29:22.099Z"))retornará"2017-08-23" mesmo que já seja o 24º no UTC.

Você precisará preencher novamente o Date.prototype.toISOString para que ele funcione no Internet Explorer 8, mas deve ser suportado em qualquer outro lugar.


Talvez valha a pena notar que isso só lhe dará 23-08-2017 se você estiver atrasado o suficiente na UTC (por exemplo, nos EUA).
Simon D

3

Sugiro usar algo como formatDate-js em vez de tentar replicá-lo sempre. Basta usar uma biblioteca que suporte todas as principais ações de tempo de strft.

new Date().format("%Y-%m-%d")

3
new Date().toLocaleDateString('pt-br').split( '/' ).reverse( ).join( '-' );

ou

new Date().toISOString().split('T')[0]
new Date('23/03/2020'.split('/').reverse().join('-')).toISOString()
new Date('23/03/2020'.split('/').reverse().join('-')).toISOString().split('T')[0]

Tente isso!


A segunda opção pode exibir a data errada, pois exibirá os dados no fuso horário UTC.
Ever Dev

2

Aqui está uma maneira de fazer isso:

var date = Date.parse('Sun May 11,2014');

function format(date) {
  date = new Date(date);

  var day = ('0' + date.getDate()).slice(-2);
  var month = ('0' + (date.getMonth() + 1)).slice(-2);
  var year = date.getFullYear();

  return year + '-' + month + '-' + day;
}

console.log(format(date));

2

Date.js é ótimo para isso.

require("datejs")
(new Date()).toString("yyyy-MM-dd")

1

function myYmd(D){
    var pad = function(num) {
        var s = '0' + num;
        return s.substr(s.length - 2);
    }
    var Result = D.getFullYear() + '-' + pad((D.getMonth() + 1)) + '-' + pad(D.getDate());
    return Result;
}

var datemilli = new Date('Sun May 11,2014');
document.write(myYmd(datemilli));


1

var d = new Date("Sun May 1,2014");

var year  = d.getFullYear();
var month = d.getMonth() + 1;
var day   = d.getDate(); 

month = checkZero(month);             
day   = checkZero(day);

var date = "";

date += year;
date += "-";
date += month;
date += "-";
date += day;

document.querySelector("#display").innerHTML = date;
    
function checkZero(i) 
{
    if (i < 10) 
    {
        i = "0" + i
    };  // add zero in front of numbers < 10

    return i;
}
<div id="display"></div>


1
new Date(new Date(YOUR_DATE.toISOString()).getTime() - 
                 (YOUR_DATE.getTimezoneOffset() * 60 * 1000)).toISOString().substr(0, 10)

1

Algumas das respostas anteriores foram boas, mas não eram muito flexíveis. Eu queria algo que realmente pudesse lidar com mais casos extremos, então peguei a resposta de @orangleliu e a expandi. https://jsfiddle.net/8904cmLd/1/

function DateToString(inDate, formatString) {
    // Written by m1m1k 2018-04-05

    // Validate that we're working with a date
    if(!isValidDate(inDate))
    {
        inDate = new Date(inDate);
    }

    // See the jsFiddle for extra code to be able to use DateToString('Sun May 11,2014', 'USA');
    //formatString = CountryCodeToDateFormat(formatString);

    var dateObject = {
        M: inDate.getMonth() + 1,
        d: inDate.getDate(),
        D: inDate.getDate(),
        h: inDate.getHours(),
        m: inDate.getMinutes(),
        s: inDate.getSeconds(),
        y: inDate.getFullYear(),
        Y: inDate.getFullYear()
    };

    // Build Regex Dynamically based on the list above.
    // It should end up with something like this: "/([Yy]+|M+|[Dd]+|h+|m+|s+)/g"
    var dateMatchRegex = joinObj(dateObject, "+|") + "+";
    var regEx = new RegExp(dateMatchRegex,"g");
    formatString = formatString.replace(regEx, function(formatToken) {
        var datePartValue = dateObject[formatToken.slice(-1)];
        var tokenLength = formatToken.length;

        // A conflict exists between specifying 'd' for no zero pad -> expand
        // to '10' and specifying yy for just two year digits '01' instead
        // of '2001'.  One expands, the other contracts.
        //
        // So Constrict Years but Expand All Else
        if (formatToken.indexOf('y') < 0 && formatToken.indexOf('Y') < 0)
        {
            // Expand single digit format token 'd' to
            // multi digit value '10' when needed
            var tokenLength = Math.max(formatToken.length, datePartValue.toString().length);
        }
        var zeroPad = (datePartValue.toString().length < formatToken.length ? "0".repeat(tokenLength) : "");
        return (zeroPad + datePartValue).slice(-tokenLength);
    });

    return formatString;
}

Exemplo de uso:

DateToString('Sun May 11,2014', 'MM/DD/yy');
DateToString('Sun May 11,2014', 'yyyy.MM.dd');
DateToString(new Date('Sun Dec 11,2014'),'yy-M-d');

Solução limpa e comentada agradável. No entanto, sou cético em relação ao primeiro argumento, que é silenciosamente substituído por uma nova data nova, se não for reconhecida como uma data válida. Prefiro colocar esse "valor padrão opcional" como o segundo argumento e retornar algum tipo de exceção (poderia ser uma string retornada "Formato de data inválido" simples) caso o formato não seja reconhecido, para que o erro apareça claramente como o testador / usuário
Balmipour 16/10/19

1

Isso funcionou para obter a data atual no formato desejado (AAAAMMDD HH: MM: SS):

var d = new Date();

var date1 = d.getFullYear() + '' +
            ((d.getMonth()+1) < 10 ? "0" + (d.getMonth() + 1) : (d.getMonth() + 1)) +
            '' +
            (d.getDate() < 10 ? "0" + d.getDate() : d.getDate());

var time1 = (d.getHours() < 10 ? "0" + d.getHours() : d.getHours()) +
            ':' +
            (d.getMinutes() < 10 ? "0" + d.getMinutes() : d.getMinutes()) +
            ':' +
            (d.getSeconds() < 10 ? "0" + d.getSeconds() : d.getSeconds());

print(date1+' '+time1);

1

Nenhuma biblioteca é necessária

Apenas JavaScript puro.

O exemplo abaixo recebe os últimos dois meses a partir de hoje:

var d = new Date()
d.setMonth(d.getMonth() - 2);
var dateString = new Date(d);
console.log('Before Format', dateString, 'After format', dateString.toISOString().slice(0,10))


Perigoso. Nesse caso, você ignora o deslocamento do fuso horário.
precisa saber é o seguinte

1

Formato de data compatível com PHP

Aqui está uma pequena função que pode usar os mesmos parâmetros que a função PHP date()e retornar uma string de data / hora em JavaScript.

Observe que nem todas as opções de formato date () do PHP são suportadas. Você pode estender o partsobjeto para criar o token de formato ausente

/**
 * Date formatter with PHP "date()"-compatible format syntax.
 */
const formatDate = (format, date) => {
  if (!format) { format = 'Y-m-d' }
  if (!date) { date = new Date() }

  const parts = {
    Y: date.getFullYear().toString(),
    y: ('00' + (date.getYear() - 100)).toString().slice(-2),
    m: ('0' + (date.getMonth() + 1)).toString().slice(-2),
    n: (date.getMonth() + 1).toString(),
    d: ('0' + date.getDate()).toString().slice(-2),
    j: date.getDate().toString(),
    H: ('0' + date.getHours()).toString().slice(-2),
    G: date.getHours().toString(),
    i: ('0' + date.getMinutes()).toString().slice(-2),
    s: ('0' + date.getSeconds()).toString().slice(-2)
  }

  const modifiers = Object.keys(parts).join('')
  const reDate = new RegExp('(?<!\\\\)[' + modifiers + ']', 'g')
  const reEscape = new RegExp('\\\\([' + modifiers + '])', 'g')

  return format
    .replace(reDate, $0 => parts[$0])
    .replace(reEscape, ($0, $1) => $1)
}

// ----- EXAMPLES -----
console.log( formatDate() ); // "2019-05-21"
console.log( formatDate('H:i:s') ); // "16:21:32"
console.log( formatDate('Y-m-d, o\\n H:i:s') ); // "2019-05-21, on 16:21:32"
console.log( formatDate('Y-m-d', new Date(2000000000000)) ); // "2033-05-18"

Essência

Aqui está uma lista com uma versão atualizada da formatDate()função e exemplos adicionais: https://gist.github.com/stracker-phil/c7b68ea0b1d5bbb97af0a6a3dc66e0d9


0

Mais uma combinação de respostas. Bem legível, mas um pouco demorado.

function getCurrentDayTimestamp() {
  const d = new Date();

  return new Date(
    Date.UTC(
      d.getFullYear(),
      d.getMonth(),
      d.getDate(),
      d.getHours(),
      d.getMinutes(),
      d.getSeconds()
    )
  // `toIsoString` returns something like "2017-08-22T08:32:32.847Z"
  // and we want the first part ("2017-08-22")
  ).toISOString().slice(0, 10);
}

0

Se a data precisar ser a mesma em todos os fusos horários, por exemplo, representar algum valor do banco de dados, use versões UTC do dia, mês, funções totalmente disponíveis no objeto de data JavaScript, pois isso será exibido na hora UTC e evite erros pontuais em determinados fusos horários.

Melhor ainda, use a biblioteca de datas Moment.js para esse tipo de formatação.


0

Eu modifiquei a resposta de Samit Satpute da seguinte forma:

var newstartDate = new Date();
// newstartDate.setDate(newstartDate.getDate() - 1);
var startDate = newstartDate.toISOString().replace(/[-T:\.Z]/g, ""); //.slice(0, 10); // To get the Yesterday's Date in YYYY MM DD Format
console.log(startDate);


0

Formate e localize a data máxima e mínima dos dados do hashmap:

var obj = {"a":'2001-15-01', "b": '2001-12-02' , "c": '2001-1-03'};

function findMaxMinDate(obj){
  let formatEncode = (id)=> { let s = id.split('-'); return `${s[0]+'-'+s[2]+'-'+s[1]}`}
  let formatDecode = (id)=> { let s = id.split('/'); return `${s[2]+'-'+s[0]+'-'+s[1]}`}
  let arr = Object.keys( obj ).map(( key )=> { return new Date(formatEncode(obj[key])); });
  let min = new Date(Math.min.apply(null, arr)).toLocaleDateString();
  let max = new Date(Math.max.apply(null, arr)).toLocaleDateString();
  return {maxd: `${formatDecode(max)}`, mind:`${formatDecode(min)}`}
}

console.log(findMaxMinDate(obj));


Como isso está relacionado à pergunta (formatação de uma data)?
Peter Mortensen

0

A reformatação de uma sequência de datas é bastante simples, por exemplo,

var s = 'Sun May 11,2014';

function reformatDate(s) {
  function z(n){return ('0' + n).slice(-2)}
  var months = [,'jan','feb','mar','apr','may','jun',
                 'jul','aug','sep','oct','nov','dec'];
  var b = s.split(/\W+/);
  return b[3] + '-' +
    z(months.indexOf(b[1].substr(0,3).toLowerCase())) + '-' +
    z(b[2]);
}

console.log(reformatDate(s));

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.