¿Obtener cadena en formato AAAAMMDD del objeto de fecha JS?

398

Estoy tratando de usar JS para convertir un date objecten una cadena en YYYYMMDDformato. ¿Hay una manera más fácil que la concatenación Date.getYear(), Date.getMonth()y Date.getDay()?

Vengador IVR
fuente
44
Concatenar a esos tres es el camino a seguir
Juan Cortés
55
Si desea una cadena que se analice en la misma fecha, no olvide aumentar el mes. Para que coincida con sus especificaciones, también debe rellenar dígitos individuales en el mes y la fecha con '0'
kennebec

Respuestas:

621

Pieza de código alterada que uso a menudo:

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
fuente
16
Debe reemplazar [1]con .length===2, porque un indexador en una cadena no es totalmente compatible. Vea esta respuesta por las razones.
Aidiakapi
66
var mm = (this.getMonth () + 101) .toStrung (). substring (0, 2);
9dan
77
Para cualquiera que quiera un ejemplo práctico de la solución de @Aidiakapi, creo un violín aquí: jsfiddle.net/pcr8xbt5/1
killercowuk
1
Si desea tener un separador de puntos:[this.getFullYear(), mm<10 ? '0'+ mm: mm, dd<10 ? '0'+ dd : dd].join('.')
Kamil Kiełczewski
3
@ 9dan no debería serlovar mm = (this.getMonth() + 101).toString().substring(1, 3)
Pnar Sbi Wer
318

No me gustó agregar al prototipo. Una alternativa sería:

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
fuente
51
Si no necesita la rightNowvariable, puede envolverla new Datey recuperarla en una sola línea:(new Date()).toISOString().slice(0,10).replace(/-/g,"")
BigBlueHat
55
Que quería YYYYMMDDHHmmSSsss, así que hice esto: var ds = (new Date()).toISOString().replace(/[^0-9]/g, "");. Bastante simple, pero debe estar encapsulado.
Jess
65
Esto no funcionará en general, ya que Date.toISOString () crea una fecha con formato UTC y, por lo tanto, puede saltar los límites de fecha según la zona horaria. Por ejemplo, en GMT + 1: (nueva Fecha (2013,13, 25)). ToISOString () == '2013-12-24T23: 00: 00.000Z'
weberste
26
Esto fallaría si alguien en el año 10000 usara su código 'nostálgico'.
Trevi Awater
10
Una mejora sugerida para hacer frente a las zonas horarias. rightNow.setMinutes(rightNow.getMinutes() - rightNow.getTimezoneOffset()); rightNow.toISOString().slice(0,10)
Andreas
182

Puedes usar la toISOStringfunción:

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

Le dará un formato "aaaa-mm-dd".

Ramzi SAYAGH
fuente
24
En algunos casos, esto no incluirá el día correcto, debido a la luz del día de la zona horaria, etc ...
Miguel
1
Tal vez mi creatividad está rota @Miguel, pero no puedo pensar en un caso en el que eso suceda. ¿Te importaría dar un ejemplo?
cloudworks
35
Si se encuentra en una zona horaria +1 y tiene una fecha [2015-09-01 00:00:00 GMT + 1], el método toISOString () devolverá la cadena '2015-08-31T23: 00: 00,000Z 'porque la fecha se convierte a UTC / 0-offset antes de ser encadenada.
Luke Baulch
Un poco más corto ... var today = (new Date ()). ToISOString (). Substring (0, 10);
teawithfruit
Falla con diferentes GMT
Tobia
133

Moment.js podría ser tu amigo

var date = new Date();
var formattedDate = moment(date).format('YYYYMMDD');
H6.
fuente
18
Bueno, sí agregué 40kb (minified, no gZip) a mi app.js, pero lo hice, gracias :).
Bart
¡La mejor respuesta hasta ahora!
TrulyXax
99
Ni siquiera me molesto en esperar hasta que inevitablemente necesite un momento más, solo lo agrego al comienzo de un proyecto :)
Martinedwards
1
Puede hacerlo más fácil:var formattedDate = moment().format('YYYYMMDD');
ns16
37

Si no necesita una solución JS pura, puede usar jQuery UI para hacer el trabajo de esta manera:

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

Por lo general, no me gusta importar demasiadas bibliotecas. Pero jQuery UI es tan útil que probablemente lo usará en otro lugar de su proyecto.

Visite http://api.jqueryui.com/datepicker/ para obtener más ejemplos.

NLemay
fuente
37

Esta es una sola línea de código que puede usar para crear una YYYY-MM-DDcadena de la fecha de hoy.

var d = new Date().toISOString().slice(0,10);
Brian Powell
fuente
^ esto! FTW! +1 ... aunque necesito probar un poco.
Gogol
21
Advertencia difícil, si su fecha fue 2016-01-01 00:00:00 GMT +2, devolverá 2015-12-31 porque toISOString()dará 2015-12-31T22: 00: 00 GMT +0 (dos 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
fuente
55
La mejor alma.
Lunes
Por alguna razón, necesitaba agregar tiempo (incluso si son las 00:00) para que la conversión no se salte un día atrás, cuando ejecuto la fórmula aquí, costa este de EE. UU. Una vez que hice eso, comenzó a funcionar de manera confiable. Lo que me encanta de esto es que puede tomar la fecha de entrada en múltiples formatos, por lo que ya no tengo que preocuparme por eso. 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 de
24

Además de la respuesta de oo, me gustaría recomendar la separación de las operaciones lógicas del retorno y colocarlas como terciarias en las variables.

Además, úselo concat()para garantizar una concatenación segura de variables

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
fuente
Si a alguien le gusta usar eso, sugiero DRY aquí, reutilice las funciones ya creadas en lugar de hacer lo mismo de nuevo.
RiZKiT
@RiZKiT DRY es un principio y no un patrón, pero seguro, esto se puede mejorar mucho. Si yo mismo usara esto, probablemente usaría otro patrón y alejaría los métodos del prototipo. Escribí principalmente el ejemplo para mostrar allí dónde hay otras formas de resolver el problema. De donde la gente lo toma depende de ellos mismos
Eric Herlitz
¡Agradable! Yo uso ("00" + (this.getDate())).slice(-2)para obtener los números basados ​​en dos dígitos. No hay una declaración "if" o "?:", Y menos llamadas a la función .getX (). Si no es un poco más rápido, al menos es más legible.
le hollandais volant
22

No me gusta modificar objetos nativos, y creo que la multiplicación es más clara que la cadena que rellena la solución aceptada.

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

Violín: http://jsfiddle.net/gbdarren/Ew7Y4/

Darren Griffith
fuente
44
Esta respuesta fue rechazada, y no sé por qué. Sentí que las matemáticas son más rápidas y claras que la manipulación de cuerdas. Si alguien sabe por qué esta es una mala respuesta, hágamelo saber.
Darren Griffith
44
El multiplicador 10000 está allí para desplazarse a la izquierda del AAAA en 4 lugares (los dígitos del mes y del día necesitan 2 dígitos cada uno) y no tiene nada que ver con el error Y10K. ¡Me gusta esta respuesta y merece respeto!
A. Masson
1
Gracias por esta respuesta, creé el violín aquí jsfiddle.net/amwebexpert/L6j0omb4
A. Masson el
1
No necesitaba la multiplicación en absoluto y no entiendo por qué está allí. jsfiddle.net/navyjax2/gbqmv0t5 De lo contrario, omita eso, y esta es una gran respuesta y me ayudó mucho.
vapcguy
1
@ D-Money Ah, descubrí lo que quieres decir: estás haciendo una concatenación de un tipo diferente al sumar los números para evitar que hagan una operación matemática diferente entre sí, una operación para no permitir la normal que ' de lo contrario los he estropeado. ¡Buen trabajo! El mío funciona porque estoy usando separadores (lo que tendría que hacer .replace('-', '')para que responda a la pregunta del OP), mientras que usted fue fiel a la pregunta original del OP y no requeriría ese paso adicional. ¡Excelente!
vapcguy
15

Solución simple JS (ES5) sin posibles problemas de salto de fecha causados ​​por la impresión de Date.toISOString () en 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, '');

Esto en respuesta al comentario de @ weberste sobre la respuesta de @Pierre Guilbert.

Lirón
fuente
now.getMonth () devolverá 0 para enero, debería ser (now.getMonth () + 1)
Jas
2
Incorrecto. La función UTC de Date espera que el mes esté entre 0 y 11 (pero se permiten otros <0 y> 11).
Dormouse
¿Por qué reemplazas varios guiones por uno solo? ¿Puede toISOStringdevolver múltiples guiones sucesivos?
Michaël Witrant
Michael: está reemplazando cada guión encontrado con un solo guión. Todavía no sé por qué (tal vez la cadena de reemplazo es solo un marcador de posición para un separador). La 'g' significa todas las ocurrencias. El patrón en el que está pensando es / [-] + / g
Gerard ONeill
2
Me has alegrado el día. He estado buscando durante días una forma simple de evitar el horrible manejo de TimeZone en Javascript, ¡y esto funciona!
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
fuente
Esta es la respuesta que usé. Un revestimiento que tiene en cuenta la zona horaria. Para responder la pregunta del póster original, podríamos hacer: (nueva Fecha (Fecha.ahora () - (nueva Fecha ()). GetTimezoneOffset () * 60000)). ToISOString (). Replace (/ [^ 0-9] / g, "") .slice (0,8)
tomwoods
gracias, para obtener AAAA-MM-DD utilicé: nueva Fecha (Fecha.ahora () - (nueva Fecha ()). 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);

Tomás Šivickas
fuente
Muy inteligente. Gracias
JMaylin
44
No funcionará ya que la nueva Fecha () tiene una zona horaria y Date.toISOString () es UTC. Mira mi respuesta.
Dormouse
@ Dormouse, ¿no es al revés? new Date()crea un nuevo objeto de fecha que es solo un contenedor alrededor de nr. de ms desde 1970/01/01 00: 00: 00.000 UTC. Luego se toISOStringimprime en la zona horaria local.
Stijn de Witt
No, se imprime Date.toISOString () en UTC.
Dormouse
7

Otra forma es usarlo toLocaleDateStringcon una configuración regional que tenga un estándar de formato de fecha big endian , como Suecia, Lituania, Hungría, Corea del Sur, ...:

date.toLocaleDateString('se')

Para eliminar los delimitadores ( -) es solo cuestión de reemplazar los no dígitos:

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

Esto no tiene el error potencial que puede obtener con los formatos de fecha UTC: la fecha UTC puede ser un día libre en comparación con la fecha en la zona horaria local.

trincot
fuente
6

Simplemente puede usar este código de una línea para obtener la fecha en el año

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

Versión un poco simplificada para la respuesta más popular en este hilo 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
fuente
5

dateformat es un paquete muy usado.

Cómo utilizar:

Descargue e instale dateformatdesde NPM. Requerirlo en su módulo:

const dateFormat = require('dateformat');

y luego simplemente formatea tus cosas:

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

Milkncookiez
fuente
4

Este tipo aquí => http://blog.stevenlevithan.com/archives/date-time-format escribió una format()función para el Dateobjeto de Javascript , por lo que se puede usar con formatos literales familiares.

Si necesita un formato de fecha con todas las funciones en el Javascript de su aplicación, úselo. De lo contrario, si lo que desea hacer es una única vez, entonces concatenar getYear (), getMonth (), getDay () probablemente sea lo más fácil.

Strelok
fuente
4

Trabajando a partir de la respuesta de @ oo, esto le devolverá la cadena de la fecha de acuerdo con una cadena de formato. Puede agregar fácilmente una expresión regular anual de 2 dígitos para el año y milisegundos y tal si los necesita.

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

Sin embargo, no sé cuán eficiente es eso, especialmente en lo que respecta al rendimiento porque usa mucha expresión regular. Probablemente podría usar algo de trabajo que no domino js puro.

Tom Tom
fuente
4

Este código es fijo para la respuesta de Pierre Guilbert:

(funciona incluso después de 10000 años)

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

Usualmente uso el siguiente código cuando necesito hacer esto.

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 da los dos últimos caracteres de la cadena.

Entonces, pase lo que pase, podemos agregar "0" al día o mes, y solo pedir los dos últimos, ya que esos son siempre los dos que queremos.

Entonces, si MyDate.getMonth () devuelve 9, será:

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

agregando .slice (-2) en eso nos da los dos últimos caracteres que es:

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

"09"

Pero si date.getMonth () devuelve 10, será:

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

entonces agregar .slice (-2) nos da los dos últimos caracteres, o:

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

"10"
Ogglas
fuente
3

Si usa AngularJs (hasta 1.5) puede usar el filtro de fecha :

var formattedDate = $filter('date')(myDate, 'yyyyMMdd')
sarín
fuente
3

Respondiendo a otro por simplicidad y legibilidad.
Además, no se recomienda editar miembros de clase predefinidos existentes con nuevos métodos:

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
fuente
2

Si no le importa incluir una biblioteca adicional (pero pequeña), Sugar.js ofrece una gran funcionalidad para trabajar con fechas en JavaScript. Para formatear una fecha, use la función de formato :

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

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

Enam
fuente
1
agregar alguna descripción a su respuesta le dará votos positivos. Intente describir un poco lo que está haciendo en este código para que otros puedan entenderlo más claramente.
Muhammad Omer Aslam
En modo estricto o mecanografiado use "let f, aaaammdd = x => ..." en su lugar. Las funciones aaaammdd yf no están definidas.
Max
2

fecha-shortcode al rescate!

const dateShortcode = require('date-shortcode')
dateShortcode.parse('{YYYYMMDD}', new Date())
//=> '20180304'
Kodie Grantham
fuente
2

Utilice 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
fuente
1

Aquí hay un enfoque más genérico que permite componentes de fecha y hora y se puede clasificar de forma idéntica como número o cadena.

Según el orden numérico del formato de fecha ISO, conviértalo a una zona horaria local y elimine los no dígitos. es decir:

// 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
fuente
1

Javascript nativo:

new Date().toLocaleString('zu-ZA').slice(0,10).replace(/-/g,'');
Lonnie Best
fuente
1
Esto no rellena los meses con un 0 para garantizar que el mes sea de 2 dígitos.
Attila Szeremi
Tienes razón. Más tarde me di cuenta de esto. Debes tener cuidado al probar el formato de fecha en meses y días de dos dígitos.
Lonnie Best