Formatee la fecha de JavaScript como aaaa-mm-dd


383

Tengo una cita con el formato Sun May 11,2014. ¿Cómo puedo convertirlo a 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));

El código anterior me da el mismo formato de fecha, sun may 11,2014. ¿Cómo puedo arreglar esto?


77
Dudo que el código anterior le dé algo más que un error de sintaxis.
plalx

Realmente considere usar una biblioteca como Moment.js. Se formateará en el resultado deseado :)
Ankur

55
¿Por qué usar una biblioteca cuando 5 líneas de código pueden hacer el trabajo? @Ankur
Black Mamba


Relacionado: ¿Qué son las cadenas de fecha y hora válidas en JavaScript? Tenga en cuenta que "Sun May 11,2014" no es una cadena de fecha válida y el análisis puede fallar en algunos navegadores.
str

Respuestas:


525

Tu puedes hacer:

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('-');
}

Ejemplo de uso:

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

Salida:

2014-05-11

Demostración en JSFiddle: http://jsfiddle.net/abdulrauf6182012/2Frm3/


11
¿Realmente múltiples declaraciones de variables en la misma declaración? stackoverflow.com/questions/694102/…
bhspencer

8
@ Fuser97381 Las declaraciones de variables múltiples en la misma declaración son más que una simple preferencia de estilo estético. Es una práctica peligrosa. Si falla inadvertidamente, agregue una coma después de cada declaración y termine creando variables globales. No es algo que deba alentarse sobre lo que puede convertirse en la respuesta canónica a una pregunta.
bhspencer

66
'use strict';@bhspencer
Vix

3
El formateo de una cadena de fecha no debe depender del análisis exitoso de cadenas no estándar por parte del analizador incorporado. Dado el formato OP, puede formatearse en menos código sin usar una fecha.
RobG

¿Cómo incrementar más 30 días en el rango 1 ~ 31?
Steve Angello

456

Simplemente aproveche el toISOStringmétodo incorporado que lleva su fecha al formato ISO 8601:

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

Donde yourDate es su objeto de fecha.

Editar: un tipo escribió esto para manejar la zona horaria en los comentarios:

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

239
Tenga cuidado con este método, ya que primero convierte a la fecha a UTC. Si está en una zona horaria + y su porción de tiempo es temprano en el día, entonces podría retroceder un día. Alternativamente, si está en una zona horaria y su porción de tiempo es tarde en el día, entonces podría avanzar un día.
Luke Baulch

44
Pruebe esto en su lugar:new Date(yourDateStr).toISOString().split('T')[0]
exbuddha

24
const offset = yourDate.getTimezoneOffset(); yourDate = new Date(yourDate.getTime() + (offset*60*1000)); yourDate.toISOString().split('T')[0] esto debería resolver el problema de la zona horaria
mjwrazor

55
now.toISOString().substring(0,10); Esta es una alternativa más limpia, ya que te recuerda que YYYY-MM-DDson los primeros diez caracteres del formato iso completo
Gutimore

44
Nota: usando la solución útil comentada por @mjwrazor, tuve que restar en lugar de agregar el desplazamiento para obtener la fecha correcta (cambiar la + (offseta - (offset)
rococó

135

Utilizo esta forma para obtener la fecha en formato aaaa-mm-dd :)

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

14
¿Cómo manejas el cambio de fecha por un día como se menciona aquí por @Luke_Baulch?
Malvineous

77
Puede hacer esto: var todayDate = new Date (); todayDate.setMinutes (todayDate.getMinutes () - todayDate.getTimezoneOffset ()); todayDate.toISOString (). slice (0,10); Esto debería ayudar a evitar el problema UTC.
Fernando Aguilar

1
@FernandoAguilar Sin embargo, una duda, ¿cómo sabemos que necesitamos restar el desplazamiento o agregarlo?
whyAto8

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

2
No siempre funciona A veces resta un día debido a la conversión UTC.
NickG

110

La forma más sencilla de convertir su fecha al formato aaaa-mm-dd es hacer esto:

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

Cómo funciona:

  • new Date("Sun May 11,2014")convierte la cadena "Sun May 11,2014"en un objeto de fecha que representa la horaSun May 11 2014 00:00:00 en una zona horaria basada en la configuración regional actual (configuración del sistema host)
  • new Date(date.getTime() - (date.getTimezoneOffset() * 60000 )) convierte su fecha en un objeto de fecha que corresponde con la hora Sun May 11 2014 00:00:00 en UTC (hora estándar) restando el desplazamiento de zona horaria
  • .toISOString() convierte el objeto de fecha en una cadena ISO 8601 2014-05-11T00:00:00.000Z
  • .split("T") divide la cadena en matriz ["2014-05-11", "00:00:00.000Z"]
  • [0] toma el primer elemento de esa matriz

Manifestación

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
¿Nadie más está horrorizado de que esta sea la forma más simple?
brecha

Sin embargo, .toISOString () no funciona correctamente con el horario de verano.
Ideas de Joe

2
@ JoeDevmon: No veo cómo eso es relevante aquí. El - (date.getTimezoneOffset() * 60000 )bit debería eliminar cualquier diferencia de zona horaria, incluido el impacto del horario de verano.
John Slegers el

2
@JohnSlegers, eso era lo que estaba pensando, pero todavía estaba recibiendo el día anterior en algunos casos. Refactoré y tu ejemplo funciona ahora. Debo haber tenido una cadena de fecha extraña o algo así. Gracias por seguir y señalarlo. +1 👍
Ideas de Joe

2
He buscado por todo lo alto y bajo en SO y otros sitios para encontrar la mejor manera de lidiar con los problemas de zona horaria con fechas en JS, y sin dudas, este es, con mucho, el mejor y el más fácil. ¡Gracias!
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

1
Me gusta la flexibilidad adicional que ofrece esta solución sobre las otras respuestas a esta pregunta. No lo he probado completamente, pero para el formato que deseaba (es decir, "aaaa-MM-dd hh: mm: ss"), funciona exactamente como se esperaba.
porcus

3
Podrías evitarlo fácilmente eval.
Salman A

3
aquí hay una versión que evita la evaluación y comenta mejor jsfiddle.net/8904cmLd/2
m1m1k

2
Me beneficié de esta respuesta. Reemplacé esa línea con la declaración eval areturn ((v.length > 1 ? "0" : "") + z[v.slice(-1)]).slice(-2);
JesusIsMyDriver.dll

26

Una combinación de algunas de las respuestas:

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

Me gusta más la solución: fácil de leer, y no depende de toISOString()las posibles dificultades de la zona horaria con el uso de esa función.
matt.fc

Este es el primero que no hace que me duela el cerebro.
ckapilla

22

Si no tiene nada en contra del uso de bibliotecas, puede usar la biblioteca Moments.js de esta manera:

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>


Solución genial, pero es un paquete de 300 kb
Adam

13

Simplemente use esto:

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

Simple y dulce;)


44
el relleno no está disponible para el formato de 2 letras. mostrará un solo dígito si la fecha o el mes es inferior a 10, por eso no se puede usar esto directamente.
Yatender Singh

Sí, pero eso se puede lograr simplemente usando JavaScript, creo que es totalmente su requisito, ¿no? @YatenderSingh
Pardeep Jain

44
sí correcto, pero verifique el título de la pregunta "aaaa-mm-dd" formato que quiere :)
Yatender Singh

var old_date = nueva Fecha (fecha); var new_date = old_date.getFullYear () + '-' + (old_date.getMonth () + 1) + '-' + old_date.getDate ()
Sitti Munirah Abdul Razak

1
Excelente. ¡Funcionó y fue simple y conciso!
Waleed93

12

toISOString()asume que su fecha es la hora local y la convierte a UTC. Obtendrá una cadena de fecha incorrecta.

El siguiente método debería devolver lo que necesita.

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

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


9

Recupere año, mes y día, y luego póngalos juntos. Recto, simple y 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

Puedes usar toLocaleDateString('fr-CA')en Dateobjeto

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

También descubrí que esas configuraciones regionales dan el resultado correcto de esta lista de configuraciones regionales Lista de todas las configuraciones regionales y sus códigos cortos.

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


¿Alguna idea de por qué esto funciona? ¿El formato ISO es solo el predeterminado, o estas configuraciones regionales realmente usan ese formato? Si es lo primero, me preocuparía que pueda cambiar inesperadamente en el futuro.
jymbob

Esto no funciona con NodeJS fuera del navegador.
Donato

@jymbob Creo que estos entornos locales utilizan realmente esos formatos. He llegado a la misma respuesta mirando esta página de Wikipedia: en.wikipedia.org/wiki/Date_format_by_country
Ciprian Tomoiagă

5

Para considerar también la zona horaria, esta línea única debería ser buena sin ninguna biblioteca:

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

5

Puedes probar esto: https://www.npmjs.com/package/timesolver

npm i timesolver

Úselo en su código:

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

Puede obtener la cadena de fecha utilizando este método:

getString

4

Ninguna de estas respuestas me satisfizo bastante. Quería una solución multiplataforma que me diera el día en la zona horaria local sin usar bibliotecas externas.

Esto es lo que se me ocurrió:

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

Eso debería devolver el día de la fecha, en formato AAAA-MM-DD, en la zona horaria que hace referencia la fecha.

Entonces, por ejemplo, localDay(new Date("2017-08-24T03:29:22.099Z"))volverá "2017-08-23"a pesar de que ya es el 24 en UTC.

Tendrá que polyfill Date.prototype.toISOString para que funcione en Internet Explorer 8, pero debe ser apoyado por todas partes.


Tal vez valga la pena señalar que solo le dará 2017-08-23 si está suficientemente detrás de UTC (por ejemplo, en los EE. UU.).
Simon D

3

Date.js es genial para esto.

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

3

Sugiero usar algo como formatDate-js en lugar de intentar replicarlo cada vez. Simplemente use una biblioteca que admita todas las acciones principales de strftime.

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

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

o

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]

¡Prueba esto!


La segunda opción puede mostrar la fecha incorrecta porque mostrará los datos en la zona horaria UTC.
Ever Dev

2

Aquí hay una forma de hacerlo:

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

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

Algunas de las respuestas anteriores estaban bien, pero no eran muy flexibles. Quería algo que realmente pudiera manejar más casos extremos, así que tomé la respuesta de @orangleliu y la amplié. 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;
}

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

Buena solución limpia y comentada. Sin embargo, soy escéptico sobre el primer argumento, que se reemplaza silenciosamente por una nueva fecha nueva si no se reconoce como una fecha válida. Prefiero poner esto "valor por defecto optionnal" como segundo argumento en su lugar, y devolver algún tipo de excepción (que podría ser un simple "formato de fecha no válido" cadena devuelta) en caso de que no se reconoce el formato, por lo que el error aparece claramente a el probador / usuario
Balmipour

1

Esto funcionó para mí para obtener la fecha actual en el formato deseado (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

No se necesita biblioteca

Solo JavaScript puro.

El siguiente ejemplo muestra los últimos dos meses a partir de hoy:

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


Peligroso. En ese caso, ignora el desplazamiento de la zona horaria.
maxence51

1

Formato de fecha compatible con PHP

Aquí hay una pequeña función que puede tomar los mismos parámetros que la función PHP date()y devolver una cadena de fecha / hora en JavaScript.

Tenga en cuenta que no todas las opciones de formato date () de PHP son compatibles. Puede extender el partsobjeto para crear el token de formato que falta

/**
 * 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"

Esencia

Aquí hay un resumen con una versión actualizada de la formatDate()función y ejemplos adicionales: https://gist.github.com/stracker-phil/c7b68ea0b1d5bbb97af0a6a3dc66e0d9


0

Otra combinación más de las respuestas. Muy bien legible, pero un poco largo.

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

Si la fecha debe ser la misma en todas las zonas horarias, por ejemplo, representa algún valor de la base de datos, asegúrese de utilizar las versiones UTC del día, mes, funciones fullear en el objeto de fecha JavaScript, ya que esto se mostrará en la hora UTC y evite errores fuera de uno en ciertas zonas horarias.

Aún mejor, use la biblioteca de fechas Moment.js para este tipo de formato.


0

He modificado la respuesta de Samit Satpute de la siguiente manera:

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

Formato y búsqueda de fecha máxima y mínima a partir de datos de 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));


¿Cómo se relaciona esto con la pregunta (formatear una fecha)?
Peter Mortensen

0

Reformatear una cadena de fecha es bastante sencillo, p. Ej.

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.