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()?

IVR Avenger
fonte
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();
oo
fonte
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;

Pierre Guilbert
fonte
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".

Ramzi SAYAGH
fonte
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');
H6
fonte
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

NLemay
fonte
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);
Brian Powell
fonte
^ 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'
gongqj
fonte
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>

Eric Herlitz
fonte
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/

Darren Griffith
fonte
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.

Dormouse
fonte
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

Kus
fonte
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);

Tomas Šivickas
fonte
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.

trincot
fonte
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();
Muhammad Ahsan
fonte
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;
}
Hero Qu
fonte
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');

Milkncookiez
fonte
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.

Strelok
fonte
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.

Tom Tom
fonte
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,"")
anmml
fonte
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"
Ogglas
fonte
3

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

var formattedDate = $filter('date')(myDate, 'yyyyMMdd')
sarin
fonte
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);
Manohar Reddy Poreddy
fonte
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}")
andersh
fonte
2

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

Enam
fonte
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

date-shortcode para o resgate!

const dateShortcode = require('date-shortcode')
dateShortcode.parse('{YYYYMMDD}', new Date())
//=> '20180304'
Kodie Grantham
fonte
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('-');
};
yajuliv
fonte
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"
chriskelly
fonte
1

Javascript nativo:

new Date().toLocaleString('zu-ZA').slice(0,10).replace(/-/g,'');
Lonnie Best
fonte
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