Obter String no formato AAAAMMDD a partir do objeto de data JS?


398

Estou tentando usar JS para transformar um date objectem uma seqüência de caracteres no YYYYMMDDformato. Existe uma maneira mais fácil do que a concatenação Date.getYear(), Date.getMonth()e Date.getDay()?


4
Concatenando os três é o caminho a percorrer
Juan Cortés

5
se você deseja uma string que será analisada na mesma data, não se esqueça de incrementar o mês. Para corresponder às suas especificações, você também precisa digitar dígitos únicos no mês e na data com '0'
kennebec

Respostas:


621

Trecho de código alterado que costumo usar:

Date.prototype.yyyymmdd = function() {
  var mm = this.getMonth() + 1; // getMonth() is zero-based
  var dd = this.getDate();

  return [this.getFullYear(),
          (mm>9 ? '' : '0') + mm,
          (dd>9 ? '' : '0') + dd
         ].join('');
};

var date = new Date();
date.yyyymmdd();

16
Você deve substituir [1]por .length===2, porque um indexador em uma string não é totalmente suportado. Veja esta resposta por razões.
Aidiakapi 04/03

6
var mm = (this.getMonth () + 101) .toStrung (). substring (0, 2);
9dan 20/08/2015

7
Para quem desejar um exemplo prático de correção 's @Aidiakapi, eu criar um violino aqui: jsfiddle.net/pcr8xbt5/1
killercowuk

11
Se você deseja [this.getFullYear(), mm<10 ? '0'+ mm: mm, dd<10 ? '0'+ dd : dd].join('.')
separar

3
@ 9dan não deveria servar mm = (this.getMonth() + 101).toString().substring(1, 3)
RNAP SBI Wer

317

Não gostei de adicionar ao protótipo. Uma alternativa seria:

var rightNow = new Date();
var res = rightNow.toISOString().slice(0,10).replace(/-/g,"");

<!-- Next line is for code snippet output only -->
document.body.innerHTML += res;


51
Se você não vai precisar da rightNowvariável ao redor, você pode quebrar new Datee começar tudo de volta em uma única linha:(new Date()).toISOString().slice(0,10).replace(/-/g,"")
BigBlueHat

5
Eu queria YYYYMMDDHHmmSSsss, então eu fiz isso: var ds = (new Date()).toISOString().replace(/[^0-9]/g, "");. Muito simples, mas deve ser encapsulado.
Jess

65
Isso não funcionará em geral, já que Date.toISOString () cria uma data no formato UTC e, portanto, pode ultrapassar os limites da data, dependendo do fuso horário. Por exemplo, em GMT + 1: (nova data (2013,13, 25)). ToISOString () == '2013-12-24T23: 00: 00.000Z'
weberste

26
Isso falharia se alguém no ano 10000 usasse seu código 'nostálgico'.
Trevi Awater

9
Uma melhoria sugerida para lidar com fusos horários. rightNow.setMinutes(rightNow.getMinutes() - rightNow.getTimezoneOffset()); rightNow.toISOString().slice(0,10)
Andreas

182

Você pode usar a toISOStringfunção:

var today = new Date();
today.toISOString().substring(0, 10);

Ele fornecerá um formato "aaaa-mm-dd".


24
Em alguns casos, isso não incluirá o dia certo, por causa do fuso horário, etc ... #
Miguel Miguel

11
Talvez minha criatividade esteja quebrada @ Miguel, mas não consigo pensar em um caso em que isso aconteceria. Você se importaria de dar um exemplo?
cloudworks

35
Se você estiver em um fuso horário +1 e tiver uma data [2015-09-01 00:00:00 GMT + 1], o método toISOString () retornará a string '2015-08-31T23: 00: 00.000Z 'porque a data é convertida em UTC / 0-offset antes de ser especificada.
Luke Baulch

Um pouco mais curto ... var today = (new Date ()). ToISOString (). Substring (0, 10);
teawithfruit

Falha com GMT diferente
Tobia

133

Moment.js poderia ser seu amigo

var date = new Date();
var formattedDate = moment(date).format('YYYYMMDD');

18
Bem, ele adicionou 40kb (compactado, não gZip) ao meu app.js, mas fui em frente, obrigado :).
22415 Bart

melhor resposta até agora!
TrulyXax 02/09

9
I não se incomodam mesmo esperando até que eu inevitavelmente precisa mais de momento, eu só adicioná-lo no início de um projeto :)
martinedwards

11
Você pode facilitar:var formattedDate = moment().format('YYYYMMDD');
ns16

37

Se você não precisar de uma solução JS pura, poderá usar a jQuery UI para fazer o trabalho da seguinte maneira:

$.datepicker.formatDate('yymmdd', new Date());

Normalmente não gosto de importar muitas bibliotecas. Mas a interface do usuário do jQuery é tão útil que você provavelmente a usará em outro lugar do seu projeto.

Visite http://api.jqueryui.com/datepicker/ para mais exemplos


37

Essa é uma única linha de código que você pode usar para criar uma YYYY-MM-DDsequência da data de hoje.

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

^ isso! FTW! +1 .. precisa testar um pouco embora.
Gogol 25/05

21
Atenção, se a sua data era 01-01-2016 00:00:00 GMT +2, ele retornará 31/12/2015, porque toISOString()dará 2015-12-31T22: 00: 00 GMT +0 (duas horas antes).
Jérôme Gillard

29
new Date('Jun 5 2016').
  toLocaleString('en-us', {year: 'numeric', month: '2-digit', day: '2-digit'}).
  replace(/(\d+)\/(\d+)\/(\d+)/, '$3-$1-$2');

// => '2016-06-05'

5
Melhor soultion.
زياد

Por algum motivo, é necessário adicionar um tempo (mesmo que 00:00) para que a conversão não volte um dia atrás, quando executo a fórmula aqui, na costa leste dos EUA. Depois que fiz isso, ele começou a funcionar de maneira confiável. O que eu amo sobre isso é que pode levar a data de entrada em vários formatos, para que eu não precise mais me preocupar com isso. new Date('Sun Mar 31 2019 00:00:00.000').toLocaleString('en-us', {year: 'numeric', month: '2-digit', day: '2-digit'}).replace(/(\d+)\/(\d+)\/(\d+)/, '$3-$1-$2');
Nenea 01/04/19

24

Além da resposta de oo, eu gostaria de recomendar a separação das operações lógicas do retorno e, em vez disso, colocá-las como ternárias nas variáveis.

Além disso, use concat()para garantir concatenação segura de variáveis

Date.prototype.yyyymmdd = function() {
  var yyyy = this.getFullYear();
  var mm = this.getMonth() < 9 ? "0" + (this.getMonth() + 1) : (this.getMonth() + 1); // getMonth() is zero-based
  var dd = this.getDate() < 10 ? "0" + this.getDate() : this.getDate();
  return "".concat(yyyy).concat(mm).concat(dd);
};

Date.prototype.yyyymmddhhmm = function() {
  var yyyymmdd = this.yyyymmdd();
  var hh = this.getHours() < 10 ? "0" + this.getHours() : this.getHours();
  var min = this.getMinutes() < 10 ? "0" + this.getMinutes() : this.getMinutes();
  return "".concat(yyyymmdd).concat(hh).concat(min);
};

Date.prototype.yyyymmddhhmmss = function() {
  var yyyymmddhhmm = this.yyyymmddhhmm();
  var ss = this.getSeconds() < 10 ? "0" + this.getSeconds() : this.getSeconds();
  return "".concat(yyyymmddhhmm).concat(ss);
};

var d = new Date();
document.getElementById("a").innerHTML = d.yyyymmdd();
document.getElementById("b").innerHTML = d.yyyymmddhhmm();
document.getElementById("c").innerHTML = d.yyyymmddhhmmss();
<div>
  yyyymmdd: <span id="a"></span>
</div>
<div>
  yyyymmddhhmm: <span id="b"></span>
</div>
<div>
  yyyymmddhhmmss: <span id="c"></span>
</div>


Se alguém gosta de usar isso, sugiro DRY aqui, reutilize as funções já criadas, em vez de fazer o mesmo novamente.
precisa saber é o seguinte

O @RiZKiT DRY é um princípio e não um padrão, mas com certeza, isso pode ser melhorado bastante. Se eu fosse usar isso eu provavelmente usaria outro padrão e afastaria os métodos do protótipo. Escrevi principalmente o exemplo para mostrar lá outras maneiras de resolver o problema. Onde as pessoas tiram de lá é com elas próprias #
Eric Herlitz

Agradável! Eu uso ("00" + (this.getDate())).slice(-2)para obter os números com dois dígitos. Não existe uma instrução "if" ou "?:" E menos chamadas para a função .getX (). Se não um pouco mais rápido, é pelo menos mais legível.
Le hollandais volant

22

Não gosto de modificar objetos nativos e acho que a multiplicação é mais clara do que a string que preenche a solução aceita.

function yyyymmdd(dateIn) {
  var yyyy = dateIn.getFullYear();
  var mm = dateIn.getMonth() + 1; // getMonth() is zero-based
  var dd = dateIn.getDate();
  return String(10000 * yyyy + 100 * mm + dd); // Leading zeros for mm and dd
}

var today = new Date();
console.log(yyyymmdd(today));

Fiddle: http://jsfiddle.net/gbdarren/Ew7Y4/


4
Esta resposta foi rebaixada e não sei por quê. Eu senti que a matemática é mais rápida e clara do que a manipulação de cordas. Se alguém souber por que essa é uma resposta ruim, entre em contato.
Darren Griffith

4
O multiplicador 10000 está lá para mudar o YYYY para a esquerda em 4 lugares (os dígitos do mês e do dia precisam de 2 dígitos cada) e não tem nada a ver com o bug do Y10K. Eu gosto desta resposta e ela merece respeito!
A. Masson

11
Obrigado por esta resposta, criei o violino aqui jsfiddle.net/amwebexpert/L6j0omb4
A. Masson

11
Eu não precisava da multiplicação e não entendo por que ela está lá. jsfiddle.net/navyjax2/gbqmv0t5 Caso contrário, deixe de fora, e esta é uma ótima resposta e me ajudou muito.
vapcguy

11
@ D-Money Ah, entendi o que você quer dizer - você está fazendo uma concatenação de um tipo diferente adicionando os números para evitar que eles façam uma operação matemática diferente entre si - uma operação para desaprovar o normal que seria ' caso contrário, estraguei tudo. Bom trabalho! O meu funciona porque estou usando separadores (que eu precisaria fazer .replace('-', '')para responder à pergunta do OP), enquanto você era fiel à pergunta original do OP e não exigia essa etapa extra. Excelente!
vapcguy

15

Solução JS simples (ES5) sem problemas de salto de data possíveis causados ​​pela impressão de Date.toISOString () no UTC:

var now = new Date();
var todayUTC = new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()));
return todayUTC.toISOString().slice(0, 10).replace(/-/g, '');

Isso em resposta ao comentário de @ weberste na resposta de @Pierre Guilbert.


now.getMonth () retornará 0 para janeiro, deve ser (now.getMonth () + 1)
Jas

2
Errado. A função UTC da data espera que o mês esteja entre 0 e 11 (mas outros <0 e> 11 são permitidos).
Dormouse

Por que você substitui vários hífens por um único? Pode toISOStringretornar vários hífens sucessivos?
Michaël Witrant

Michael - ele está substituindo cada hífen encontrado por um único hífen. Ainda não sei por que (talvez a string de substituição seja apenas um espaço reservado para um separador). O 'g' significa todas as ocorrências. O padrão em que você está pensando é / [-] + / g
Gerard ONeill

2
Você fez meu dia. Eu estive procurando por dias uma maneira simples de ignorar a horrível manipulação do TimeZone em Javascript, e isso faz o truque!
Guillaume F.

10

// UTC/GMT 0
document.write('UTC/GMT 0: ' + (new Date()).toISOString().slice(0, 19).replace(/[^0-9]/g, "")); // 20150812013509

// Client local time
document.write('<br/>Local time: ' + (new Date(Date.now()-(new Date()).getTimezoneOffset() * 60000)).toISOString().slice(0, 19).replace(/[^0-9]/g, "")); // 20150812113509


Esta é a resposta que eu usei. Um revestimento que leva em consideração o fuso horário. Para responder à pergunta do pôster original, poderíamos fazer: (new Date (Date.now () - (new Date ()). GetTimezoneOffset () * 60000)). ToISOString (). Replace (/ [^ 0-9] / g, "") .slice (0,8)
tomwoods

thx, para obter AAAA-MM-DD, usei: new Date (Date.now () - (new Date ()). getTimezoneOffset () * 60000) .toISOString (). slice (0, 10) .replace (/ [ ^ 0-9] / g, "-")
Nick Humphrey

7

var someDate = new Date();
var dateFormated = someDate.toISOString().substr(0,10);

console.log(dateFormated);


Muito esperto. Obrigado
JMaylin

4
Não funcionará, pois new Date () possui um fuso horário e Date.toISOString () é UTC. Veja minha resposta.
Dormouse

@ Dormouse não é o contrário? new Date()cria um novo objeto de data que é apenas um invólucro em torno de nr. de ms desde 01/01/1970 00: 00: 00.000 UTC. Em seguida, toISOStringimprime no fuso horário local.
Stijn de Witt

Não, Date.toISOString () é impresso em UTC.
Dormouse

7

Outra maneira é usar toLocaleDateStringcom um código de idioma que possui um padrão de formato de data big-endian , como Suécia, Lituânia, Hungria, Coréia do Sul, ...:

date.toLocaleDateString('se')

Para remover os delimitadores ( -), basta substituir os que não são dígitos:

console.log( new Date().toLocaleDateString('se').replace(/\D/g, '') );

Isso não possui o erro potencial que você pode obter com os formatos de data UTC: a data UTC pode ter um dia de folga em comparação com a data no fuso horário local.


6

Você pode simplesmente usar este código de uma linha para obter a data no ano

var date = new Date().getFullYear() + "-" + (parseInt(new Date().getMonth()) + 1) + "-" + new Date().getDate();

5

Versão pouco simplificada para a resposta mais popular neste tópico https://stackoverflow.com/a/3067896/5437379 :

function toYYYYMMDD(d) {
    var yyyy = d.getFullYear().toString();
    var mm = (d.getMonth() + 101).toString().slice(-2);
    var dd = (d.getDate() + 100).toString().slice(-2);
    return yyyy + mm + dd;
}

5

dateformat é um pacote muito usado.

Como usar:

Baixe e instale dateformatno NPM. Exija no seu módulo:

const dateFormat = require('dateformat');

e apenas formate suas coisas:

const myYYYYmmddDate = dateformat(new Date(), 'yyyy-mm-dd');


4

Esse cara aqui => http://blog.stevenlevithan.com/archives/date-time-format escreveu uma format()função para o Dateobjeto Javascript , para que possa ser usado com formatos literais familiares.

Se você precisar de formatação de data com todos os recursos no Javascript do seu aplicativo, use-o. Caso contrário, se o que você quer fazer é único, concatenar getYear (), getMonth (), getDay () é provavelmente mais fácil.


4

Trabalhando com a resposta do @ oo, você retornará a sequência da data de acordo com uma sequência de formato. Você pode adicionar facilmente uma regex do ano de 2 dígitos para o ano e milissegundos e outros, se precisar deles.

Date.prototype.getFromFormat = function(format) {
    var yyyy = this.getFullYear().toString();
    format = format.replace(/yyyy/g, yyyy)
    var mm = (this.getMonth()+1).toString(); 
    format = format.replace(/mm/g, (mm[1]?mm:"0"+mm[0]));
    var dd  = this.getDate().toString();
    format = format.replace(/dd/g, (dd[1]?dd:"0"+dd[0]));
    var hh = this.getHours().toString();
    format = format.replace(/hh/g, (hh[1]?hh:"0"+hh[0]));
    var ii = this.getMinutes().toString();
    format = format.replace(/ii/g, (ii[1]?ii:"0"+ii[0]));
    var ss  = this.getSeconds().toString();
    format = format.replace(/ss/g, (ss[1]?ss:"0"+ss[0]));
    return format;
};

d = new Date();
var date = d.getFromFormat('yyyy-mm-dd hh:ii:ss');
alert(date);

No entanto, não sei quão eficiente isso é, especialmente em termos de desempenho, porque usa muita regex. Provavelmente poderia usar algum trabalho que não domino js puros.


4

Este código está corrigido na resposta de Pierre Guilbert:

(funciona mesmo depois de 10000 anos)

YYYYMMDD=new Date().toISOString().slice(0,new Date().toISOString().indexOf("T")).replace(/-/g,"")


3

Normalmente, uso o código abaixo quando preciso fazer isso.

var date = new Date($.now());
var dateString = (date.getFullYear() + '-'
    + ('0' + (date.getMonth() + 1)).slice(-2)
    + '-' + ('0' + (date.getDate())).slice(-2));
console.log(dateString); //Will print "2015-09-18" when this comment was written

Para explicar, .slice (-2) nos fornece os dois últimos caracteres da string.

Então, não importa o que aconteça, podemos adicionar "0" ao dia ou mês e apenas pedir os dois últimos, pois esses são sempre os dois que queremos.

Portanto, se MyDate.getMonth () retornar 9, será:

("0" + "9") // Giving us "09"

adicionando .slice (-2) nos dados dos dois últimos caracteres, que é:

("0" + "9").slice(-2)

"09"

Mas se date.getMonth () retornar 10, será:

("0" + "10") // Giving us "010"

adicionando .slice (-2), obtemos os dois últimos caracteres, ou:

("0" + "10").slice(-2)

"10"

3

Se você usar AngularJs (até 1,5), poderá usar o filtro de data :

var formattedDate = $filter('date')(myDate, 'yyyyMMdd')

3

Respondendo a outro por simplicidade e legibilidade.
Além disso, a edição de membros da classe predefinidos existentes com novos métodos não é incentivada:

function getDateInYYYYMMDD() {
    let currentDate = new Date();

    // year
    let yyyy = '' + currentDate.getFullYear();

    // month
    let mm = ('0' + (currentDate.getMonth() + 1));  // prepend 0 // +1 is because Jan is 0
    mm = mm.substr(mm.length - 2);                  // take last 2 chars

    // day
    let dd = ('0' + currentDate.getDate());         // prepend 0
    dd = dd.substr(dd.length - 2);                  // take last 2 chars

    return yyyy + "" + mm + "" + dd;
}

var currentDateYYYYMMDD = getDateInYYYYMMDD();
console.log('currentDateYYYYMMDD: ' + currentDateYYYYMMDD);


2

Se você não se importa de incluir uma biblioteca adicional (mas pequena), o Sugar.js fornece muitas funcionalidades interessantes para trabalhar com datas em JavaScript. Para formatar uma data, use a função de formatação :

new Date().format("{yyyy}{MM}{dd}")

2

yyyymmdd=x=>(f=x=>(x<10&&'0')+x,x.getFullYear()+f(x.getMonth()+1)+f(x.getDate()));
alert(yyyymmdd(new Date));


11
adicionar alguma descrição à sua resposta fará com que você faça votos positivos, tentando descrever um pouco o que você está fazendo neste código, para que outros possam entendê-lo mais claramente.
Muhammad Omer Aslam

No modo estrito ou datilografado, use "let f, yyyymmdd = x => ...". As funções aaaammdd ef são de outra forma indefinidas.
Max


2

Use o padStart :

Date.prototype.yyyymmdd = function() {
    return [
        this.getFullYear(),
        (this.getMonth()+1).toString().padStart(2, '0'), // getMonth() is zero-based
        this.getDate().toString().padStart(2, '0')
    ].join('-');
};

1

Aqui está uma abordagem mais genérica que permite componentes de data e hora e é identificável como número ou sequência de caracteres.

Com base na ordem numérica do formato ISO da data, converta para um fuso horário local e remova não dígitos. ou seja:

// monkey patch version
Date.prototype.IsoNum = function (n) {
    var tzoffset = this.getTimezoneOffset() * 60000; //offset in milliseconds
    var localISOTime = (new Date(this - tzoffset)).toISOString().slice(0,-1);
    return localISOTime.replace(/[-T:\.Z]/g, '').substring(0,n || 20); // YYYYMMDD
}

Uso

var d = new Date();
// Tue Jul 28 2015 15:02:53 GMT+0200 (W. Europe Daylight Time)
console.log(d.IsoNum(8));  // "20150728"
console.log(d.IsoNum(12)); // "201507281502"
console.log(d.IsoNum());   // "20150728150253272"

1

Javascript nativo:

new Date().toLocaleString('zu-ZA').slice(0,10).replace(/-/g,'');

11
Isso não preenche os meses com um 0 para garantir que o mês tenha 2 dígitos.
Attila Szeremi

Você está certo. Mais tarde notei isso eu mesmo. Você precisa ter cuidado ao testar a formatação da data em meses e dias de dois dígitos.
22718 Lonnie Melhor
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.