Convertir una cadena a una fecha en JavaScript


669

¿Cómo puedo convertir una cadena a una fecha en JavaScript?

var st = "date in some format"
var dt = new date();

var dt_st= //st in date format same as dt


1
Oh, estoy confundido ahora. ¿Quieres Date -> Stringo String -> Date?
Felix Kling

10
considere momentjs.com
hanshenrik

Respuestas:


828

El mejor formato de cadena para el análisis de cadenas es el formato ISO de fecha junto con el constructor del objeto Fecha de JavaScript.

Ejemplos de formato ISO: YYYY-MM-DDoYYYY-MM-DDTHH:MM:SS .

¡Pero espera! El simple uso del "formato ISO" no funciona de manera confiable por sí solo. Las cadenas a veces se analizan como UTC y a veces como localtime (según el proveedor y la versión del navegador). La mejor práctica siempre debe ser almacenar fechas como UTC y realizar cálculos como UTC.

Para analizar una fecha como UTC, agregue una Z , por ejemplo:new Date('2011-04-11T10:20:30Z') .

Para mostrar una fecha en UTC, use .toUTCString(),
para mostrar una fecha en la hora local del usuario, use.toString() .

Más información sobre MDN | Fecha y esta respuesta .

Para compatibilidad antigua de Internet Explorer (versiones decir, menos de 9 no son compatibles con el formato ISO en Fecha constructor), debe dividir representación de cadena de fecha y hora de sus partes y luego se puede utilizar el constructor de fecha y hora utilizando partes, por ejemplo: new Date('2011', '04' - 1, '11', '11', '51', '00'). Tenga en cuenta que el número del mes debe ser 1 menos.


Método alternativo: use una biblioteca adecuada:

También puede aprovechar la biblioteca Moment.js que permite analizar la fecha con la zona horaria especificada.


También tuve que usar el método de "dividir la cadena" para el safari por el mismo problema "Nan" que trajo Paul Tomblin. La nueva fecha ('2011-04-11 11:51:00') devolvería 'fecha inválida'.
Amós

1
@Amos: observe la letra T, que separa la fecha y la hora. Si escribe new Date('2011-04-11T11:51:00')la fecha de creación es válida.
Pavel Hodek

Lamentablemente, me topé con el problema de que * no funciona para TODOS los usuarios .
Roman Podlinov el

3
Dejar que Date analice una cadena es la peor manera de crear un objeto Date. Mucho mejor analizar la cadena manualmente y llamar a Date como constructor. Algunos navegadores tratarán una cadena ISO sin zona horaria como UTC, otros como locales.
RobG

66
@Ben Taliadoros: Sí, no es válido en todos los navegadores comunes, new Date('1970-30-02')es una fecha no válida porque no hay 30 meses en un año. No puede desbordar los meses, pero cuando desborda los días, se resuelve en Chrome y Firefox a una fecha válida: new Date('1970-02-30')es el mismo día que la nueva Fecha ('1970-03-02').
Pavel Hodek

291

Lamentablemente descubrí que

var mydate = new Date('2014-04-03');
console.log(mydate.toDateString());

devuelve "Mié, 02 de abril de 2014". Sé que suena loco, pero sucede para algunos usuarios.

La solución a prueba de balas es la siguiente:

var parts ='2014-04-03'.split('-');
// Please pay attention to the month (parts[1]); JavaScript counts months from 0:
// January - 0, February - 1, etc.
var mydate = new Date(parts[0], parts[1] - 1, parts[2]); 
console.log(mydate.toDateString());


45
No es una locura en absoluto, el ajuste probablemente se deba a la activación del horario de verano . Las fechas en formato de yyyy-MM-ddse analizan como UTC y toString devuelve la hora local, por lo tanto, dependiendo de la zona horaria de los usuarios, definitivamente puede devolver resultados diferentes. Si siempre desea la hora como UTC, entonces debe usar toUTCString .
James

He estado golpeando mi cabeza con este. Esto parece funcionar, pero no entiendo por qué usaste partes [0] -1 y no solo partes [0].
Adam Youngers

44
@AdamYoungers Debido a que Javascript cuenta meses desde 0: enero - 0, febrero - 1, etc.
Roman Podlinov

1
Esta respuesta sugiere que el comportamiento en el ejemplo es incorrecto. Según la especificación: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… (ver: fechas) el valor superado en el ejemplo sería correcto
James Ross


81
function stringToDate(_date,_format,_delimiter)
{
            var formatLowerCase=_format.toLowerCase();
            var formatItems=formatLowerCase.split(_delimiter);
            var dateItems=_date.split(_delimiter);
            var monthIndex=formatItems.indexOf("mm");
            var dayIndex=formatItems.indexOf("dd");
            var yearIndex=formatItems.indexOf("yyyy");
            var month=parseInt(dateItems[monthIndex]);
            month-=1;
            var formatedDate = new Date(dateItems[yearIndex],month,dateItems[dayIndex]);
            return formatedDate;
}

stringToDate("17/9/2014","dd/MM/yyyy","/");
stringToDate("9/17/2014","mm/dd/yyyy","/")
stringToDate("9-17-2014","mm-dd-yyyy","-")

3
Maneja fechas de cada variación, no solo el formato de EE. UU.
Mark Jones

44
@ MarkJones No confíes en el .indexOf()método ya que no es compatible con varios navegadores sin polyfils. En su lugar, use los métodos JS más compatibles .match()o .test()vainilla.
Alexander Dixon

1
Agregando var _delimiter = _format.match(/\W/g)[0];al principio de la función puede obtener el delimitador automáticamente y prescindir del tercer parámetro.
campjos

39

moment.js ( http://momentjs.com/ ) es un paquete completo y bueno para fechas de uso y admite cadenas ISO 8601 .

Puede agregar una fecha y formato de cadena.

moment("12-25-1995", "MM-DD-YYYY");

Y puede verificar si una fecha es válida.

moment("not a real date").isValid(); //Returns false

Algunos ejemplos de visualización

let dt = moment("02-01-2019", "MM-DD-YYYY");
console.log(dt.fromNow()+' |'+dt.format('LL')) 
// output: "3 months ago | February 1, 2019"

Consulte la documentación http://momentjs.com/docs/#/parsing/string-format/

Recomendación: recomiendo utilizar un paquete para fechas que contenga muchos formatos porque la zona horaria y la gestión del tiempo de formato es realmente un gran problema, en el momento en que se resuelven muchos formatos. Puede analizar fácilmente la fecha desde una cadena simple hasta la fecha, pero creo que es un trabajo difícil admitir todos los formatos y variaciones de fechas.


1
Algunas salidas de ejemplos de visualización let dt = moment("02-01-2019", "MM-DD-YYYY");console.log(dt.fromNow()+' | '+dt.format('LL')) : "hace 3 meses | 1 de febrero de 2019"
CPHPython

36

Pásalo como argumento a Date ():

var st = "date in some format"
var dt = new Date(st);

Puede acceder a la fecha, mes, año, utilizando, por ejemplo: dt.getMonth().


8
lo hago console.log(new Date('30-08-2018'))y obtengo una fecha no válida
Dwigh

Esta respuesta ignora las múltiples complejidades de este problema, por ejemplo, si hago esto para una fecha 01/02/2020en mi computadora (en el Reino Unido), devolverá el 1 de febrero, donde, como si se hiciera lo mismo en los EE. UU., Volverá el 2 de enero. Casi nunca deberías usar esta ingenua implementación. Utilizar momento en su lugar.
Liam

23

Si puede usar la excelente biblioteca de momentos (por ejemplo, en un proyecto Node.js), puede analizar fácilmente su fecha usando, por ejemplo,

var momentDate = moment("2014-09-15 09:00:00");

y puede acceder al objeto de fecha JS a través de

momentDate ().toDate();

55
tenga en cuenta que el momento funciona bien sin nodo
shaheer

Recibí un error de NaN en mis dispositivos Android e IOS al usar este código, sin embargo, funcionaba en el escritorio. aquí está el código que estaba usando antes: var dateTimeOfTimeIn = new Date (año + "-" + mes + "-" + día + "T" + data.timeIn); usando este enfoque y la biblioteca de momentos, mi problema se resolvió y mi código ahora funciona bien en todos mis dispositivos.
Mehdi

20

new Date(2000, 10, 1) le dará "Mié Nov 01 2000 00:00:00 GMT + 0100 (CET)"

Mira que 0 por mes te da enero


19

Para aquellos que buscan una solución pequeña e inteligente:

String.prototype.toDate = function(format)
{
  var normalized      = this.replace(/[^a-zA-Z0-9]/g, '-');
  var normalizedFormat= format.toLowerCase().replace(/[^a-zA-Z0-9]/g, '-');
  var formatItems     = normalizedFormat.split('-');
  var dateItems       = normalized.split('-');

  var monthIndex  = formatItems.indexOf("mm");
  var dayIndex    = formatItems.indexOf("dd");
  var yearIndex   = formatItems.indexOf("yyyy");
  var hourIndex     = formatItems.indexOf("hh");
  var minutesIndex  = formatItems.indexOf("ii");
  var secondsIndex  = formatItems.indexOf("ss");

  var today = new Date();

  var year  = yearIndex>-1  ? dateItems[yearIndex]    : today.getFullYear();
  var month = monthIndex>-1 ? dateItems[monthIndex]-1 : today.getMonth()-1;
  var day   = dayIndex>-1   ? dateItems[dayIndex]     : today.getDate();

  var hour    = hourIndex>-1      ? dateItems[hourIndex]    : today.getHours();
  var minute  = minutesIndex>-1   ? dateItems[minutesIndex] : today.getMinutes();
  var second  = secondsIndex>-1   ? dateItems[secondsIndex] : today.getSeconds();

  return new Date(year,month,day,hour,minute,second);
};

Ejemplo:

"22/03/2016 14:03:01".toDate("dd/mm/yyyy hh:ii:ss");
"2016-03-29 18:30:00".toDate("yyyy-mm-dd hh:ii:ss");

¡Funciona de maravilla! Me salvaste la vida, amigo!
Steve Nosse


12

Si desea convertir desde el formato "dd / MM / aaaa". Aquí hay un ejemplo:

var pattern = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
var arrayDate = stringDate.match(pattern);
var dt = new Date(arrayDate[3], arrayDate[2] - 1, arrayDate[1]);

Esta solución funciona en versiones IE inferiores a 9.


12

Las marcas de tiempo se deben convertir a un número

var ts = '1471793029764';
ts = Number(ts); // cast it to a Number
var date = new Date(ts); // works

var invalidDate = new Date('1471793029764'); // does not work. Invalid Date

1
¿Qué pasa con el undefinedvalor? Así como: var date = new Date(undefined)?
Benny Neugebauer

@BennyNeugebauer comprueba bien si un valor no está definido antes de intentar pasarlo al constructor Fecha. Tal vez desee lanzar una excepción o tal vez desee recurrir a una fecha predeterminada, ¿quién sabe?
Lucky Soni

9

Date.parsecasi te da lo que quieres. Se ahoga en la parte am/ pm, pero con un poco de pirateo puede hacer que funcione:

var str = 'Sun Apr 25, 2010 3:30pm',
    timestamp;

timestamp = Date.parse(str.replace(/[ap]m$/i, ''));

if(str.match(/pm$/i) >= 0) {
    timestamp += 12 * 60 * 60 * 1000;
}

6

Convertir a formato pt-BR:

    var dateString = "13/10/2014";
    var dataSplit = dateString.split('/');
    var dateConverted;

    if (dataSplit[2].split(" ").length > 1) {

        var hora = dataSplit[2].split(" ")[1].split(':');
        dataSplit[2] = dataSplit[2].split(" ")[0];
        dateConverted = new Date(dataSplit[2], dataSplit[1]-1, dataSplit[0], hora[0], hora[1]);

    } else {
        dateConverted = new Date(dataSplit[2], dataSplit[1] - 1, dataSplit[0]);
    }

Espero ayudar a alguien !!!



4

Para convertir cadenas a la fecha en js, uso http://momentjs.com/

moment().format('MMMM Do YYYY, h:mm:ss a'); // August 16th 2015, 4:17:24 pm
moment().format('dddd');                    // Sunday
moment().format("MMM Do YY");               // Aug 16th 15
moment().format('YYYY [escaped] YYYY');     // 2015 escaped 2015
moment("20111031", "YYYYMMDD").fromNow(); // 4 years ago
moment("20120620", "YYYYMMDD").fromNow(); // 3 years ago
moment().startOf('day').fromNow();        // 16 hours ago
moment().endOf('day').fromNow();          // in 8 hours

1
moment () toma por defecto la fecha actual. Cómo formatear una cadena que está en formato "2016-06-27 17: 49: 51.951602 + 05: 30" usando el momento.
Zoran777

4

Hice esta función para convertir cualquier objeto de fecha en un objeto de fecha UTC.

function dateToUTC(date) {
    return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
}


dateToUTC(new Date());

3

Otra forma más de hacerlo:

String.prototype.toDate = function(format) {
    format = format || "dmy";
    var separator = this.match(/[^0-9]/)[0];
    var components = this.split(separator);
    var day, month, year;
    for (var key in format) {
        var fmt_value = format[key];
        var value = components[key];
        switch (fmt_value) {
            case "d":
                day = parseInt(value);
                break;
            case "m":
                month = parseInt(value)-1;
                break;
            case "y":
                year = parseInt(value);
        }
    }
    return new Date(year, month, day);
};
a = "3/2/2017";
console.log(a.toDate("dmy"));
// Date 2017-02-03T00:00:00.000Z

Ah! ¡Ordenado! Finalmente un código que se encarga de cualquier separador que se use.
Sam Sirry

3

Puedes probar esto:

function formatDate(userDOB) {
  const dob = new Date(userDOB);

  const monthNames = [
    'January', 'February', 'March', 'April', 'May', 'June', 'July',
     'August', 'September', 'October', 'November', 'December'
  ];

  const day = dob.getDate();
  const monthIndex = dob.getMonth();
  const year = dob.getFullYear();

  // return day + ' ' + monthNames[monthIndex] + ' ' + year;
  return `${day} ${monthNames[monthIndex]} ${year}`;
}

console.log(formatDate('1982-08-10'));


2
var date = new Date(year, month, day);

o

var date = new Date('01/01/1970');

la cadena de fecha en formato '01 -01-1970 'no funcionará en Firefox, así que mejor use "/" en lugar de "-" en la cadena de formato de fecha.


mi cadena es "2015/08/03 13:06:16" strF en FF no funciona
Dhara

2

Si necesita verificar el contenido de la cadena antes de convertir al formato Fecha:

// Convert 'M/D/YY' to Date()
mdyToDate = function(mdy) {
  var d = mdy.split(/[\/\-\.]/, 3);

  if (d.length != 3) return null;

  // Check if date is valid
  var mon = parseInt(d[0]), 
      day = parseInt(d[1]),
      year= parseInt(d[2]);
  if (d[2].length == 2) year += 2000;
  if (day <= 31 && mon <= 12 && year >= 2015)
    return new Date(year, mon - 1, day);

  return null; 
}

2

He creado la función parseDateTime para convertir la cadena al objeto de fecha y funciona en todos los navegadores (incluido el navegador IE), verifique si alguien lo requiere, consulte https://github.com/Umesh-Markande/Parse-String-to-Date -en-todo-navegador

    function parseDateTime(datetime) {
            var monthNames = [
                "January", "February", "March",
                "April", "May", "June", "July",
                "August", "September", "October",
                "November", "December"
              ];
            if(datetime.split(' ').length == 3){
                var date = datetime.split(' ')[0];
                var time = datetime.split(' ')[1].replace('.00','');
                var timearray = time.split(':');
                var hours = parseInt(time.split(':')[0]);
                var format = datetime.split(' ')[2];
                var bits = date.split(/\D/);
                date = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
                var day = date.getDate();
                var monthIndex = date.getMonth();
                var year = date.getFullYear();
                if ((format === 'PM' || format === 'pm') && hours !== 12) {
                    hours += 12;
                    try{  time = hours+':'+timearray[1]+':'+timearray[2] }catch(e){ time = hours+':'+timearray[1] }
                } 
                var formateddatetime = new Date(monthNames[monthIndex] + ' ' + day + '  ' + year + ' ' + time);
                return formateddatetime;
            }else if(datetime.split(' ').length == 2){
                var date = datetime.split(' ')[0];
                var time = datetime.split(' ')[1];
                var bits = date.split(/\D/);
                var datetimevalue = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
                var day = datetimevalue.getDate();
                var monthIndex = datetimevalue.getMonth();
                var year = datetimevalue.getFullYear();
                var formateddatetime = new Date(monthNames[monthIndex] + ' ' + day + '  ' + year + ' ' + time);
                return formateddatetime;
            }else if(datetime != ''){
                var bits = datetime.split(/\D/);
                var date = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
                return date;
            }
            return datetime;
        }

    var date1 = '2018-05-14 05:04:22 AM';   // yyyy-mm-dd hh:mm:ss A
    var date2 = '2018/05/14 05:04:22 AM';   // yyyy/mm/dd hh:mm:ss A
    var date3 = '2018/05/04';   // yyyy/mm/dd
    var date4 = '2018-05-04';   // yyyy-mm-dd
    var date5 = '2018-05-14 15:04:22';   // yyyy-mm-dd HH:mm:ss
    var date6 = '2018/05/14 14:04:22';   // yyyy/mm/dd HH:mm:ss

    console.log(parseDateTime(date1))
    console.log(parseDateTime(date2))
    console.log(parseDateTime(date3))
    console.log(parseDateTime(date4))
    console.log(parseDateTime(date5))
    console.log(parseDateTime(date6))

**Output---**
Mon May 14 2018 05:04:22 GMT+0530 (India Standard Time)
Mon May 14 2018 05:04:22 GMT+0530 (India Standard Time)
Fri May 04 2018 00:00:00 GMT+0530 (India Standard Time)
Fri May 04 2018 00:00:00 GMT+0530 (India Standard Time)
Mon May 14 2018 15:04:22 GMT+0530 (India Standard Time)
Mon May 14 2018 14:04:22 GMT+0530 (India Standard Time)

Este me funcionó. Gracias.
Christopher D. Emerson

2

Esta respuesta se basa en la respuesta de Kassem, pero también maneja años de dos dígitos. Envié una edición a la respuesta de Kassem, pero en caso de que no fuera aprobada, también la enviaré como una respuesta separada.

function stringToDate(_date,_format,_delimiter) {
        var formatLowerCase=_format.toLowerCase();
        var formatItems=formatLowerCase.split(_delimiter);
        var dateItems=_date.split(_delimiter);
        var monthIndex=formatItems.indexOf("mm");
        var dayIndex=formatItems.indexOf("dd");
        var yearIndex=formatItems.indexOf("yyyy");
        var year = parseInt(dateItems[yearIndex]); 
        // adjust for 2 digit year
        if (year < 100) { year += 2000; }
        var month=parseInt(dateItems[monthIndex]);
        month-=1;
        var formatedDate = new Date(year,month,dateItems[dayIndex]);
        return formatedDate;
}

stringToDate("17/9/14","dd/MM/yyyy","/");
stringToDate("17/9/2014","dd/MM/yyyy","/");
stringToDate("9/17/2014","mm/dd/yyyy","/")
stringToDate("9-17-2014","mm-dd-yyyy","-")

1

Puede usar regex para analizar la cadena para detallar la hora y luego crear la fecha o cualquier formato de retorno como:

//example : let dateString = "2018-08-17 01:02:03.4"

function strToDate(dateString){
    let reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}).(\d{1})/
  , [,year, month, day, hours, minutes, seconds, miliseconds] = reggie.exec(dateString)
  , dateObject = new Date(year, month-1, day, hours, minutes, seconds, miliseconds);
  return dateObject;
}
alert(strToDate(dateString));

1

Actuación

Hoy (2020.05.08) realizo pruebas para las soluciones elegidas, para dos casos: la fecha de entrada es la cadena ISO8601 (Ad, Bd, Cd, Dd, Ed) y la fecha de entrada es la marca de tiempo (At, Ct, Dt). Las soluciones Bd, Cd, Ct no devuelven el objeto js Date como resultados, pero las agrego porque pueden ser útiles pero no las comparo con soluciones válidas. Estos resultados pueden ser útiles para el análisis masivo de fechas.

Conclusiones

  • Solución new Date (anuncio) es 50-100 veces más rápida que moment.js (Dd) para todos los navegadores con fecha y hora ISO
  • La solución new Date(anuncio) es ~ 10 veces más rápida queparseDate (Ed)
  • La solución Date.parse(Bd) es más rápida si es necesario obtener la marca de tiempo de la fecha ISO en todos los navegadores

ingrese la descripción de la imagen aquí

Detalles

Realizo pruebas en MacOs High Sierra 10.13.6 en Chrome 81.0, Safari 13.1, Firefox 75.0. La solución parseDate(Ed) usa new Date(0)y configura manualmente los componentes de fecha UTC.

Resultados para el cromo

ingrese la descripción de la imagen aquí


0

Las cadenas de fechas ISO 8601-esque, tan excelentes como el estándar, todavía no son ampliamente compatibles.

Este es un gran recurso para determinar qué formato de cadena de fechas debe usar:

http://dygraphs.com/date-formats.html

Sí, eso significa que su cadena de fechas podría ser tan simple como opuesta a

"2014/10/13 23:57:52" en vez de "2014-10-13 23:57:52"


0
                //little bit of code for Converting dates 

                var dat1 = document.getElementById('inputDate').value;
                var date1 = new Date(dat1)//converts string to date object
                alert(date1);
                var dat2 = document.getElementById('inputFinishDate').value;
                var date2 = new Date(dat2)
                alert(date2);

0

use este código: (mi problema se resolvió con este código)

function dateDiff(date1, date2){
var diff = {}                           // Initialisation du retour
var tmp = date2 - date1;

tmp = Math.floor(tmp/1000);             // Nombre de secondes entre les 2 dates
diff.sec = tmp % 60;                    // Extraction du nombre de secondes

tmp = Math.floor((tmp-diff.sec)/60);    // Nombre de minutes (partie entière)
diff.min = tmp % 60;                    // Extraction du nombre de minutes

tmp = Math.floor((tmp-diff.min)/60);    // Nombre d'heures (entières)
diff.hour = tmp % 24;                   // Extraction du nombre d'heures

tmp = Math.floor((tmp-diff.hour)/24);   // Nombre de jours restants
diff.day = tmp;

return diff;

}


3
por favor explique su respuesta
Mazz

Los parámetros date1 y date2 deben tener el formato de fecha correcta.
Fetra

la fecha de retorno de la función denominada diff. Si desea que se devuelva el número de días, haga lo siguiente: var result = dateDiff (date1, date2); var número_día = resultado.día; es fácil
Fetra

0

Escribí una función reutilizable que uso cuando obtengo cadenas de fecha del servidor.
puede pasar su delimitador deseado (/ - etc.) que separa el día mes y año para usar elsplit() método.
puedes verlo y probarlo en este ejemplo de trabajo .

<!DOCTYPE html>
<html>
  <head>
    <style>
    </style>
  </head>
  <body>
    <div>
      <span>day:
      </span> 
      <span id='day'>
      </span>
    </div>
    <div>
      <span>month:
      </span> 
      <span id='month'>
      </span>
    </div>
    <div>
      <span>year:
      </span> 
      <span id='year'>
      </span>
    </div>
    <br/>
    <input type="button" id="" value="convert" onClick="convert('/','28/10/1980')"/>
    <span>28/10/1980
    </span>
    <script>
      function convert(delimiter,dateString)
      {
        var splitted = dateString.split('/');
        // create a new date from the splitted string 
        var myDate = new Date(splitted[2],splitted[1],splitted[0]);
        // now you can access the Date and use its methods 
        document.getElementById('day').innerHTML = myDate.getDate();
        document.getElementById('month').innerHTML = myDate.getMonth();
        document.getElementById('year').innerHTML = myDate.getFullYear();
      }
    </script>
  </body>
</html>

0

Otra forma de hacerlo es construir una expresión regular con grupos de captura con nombre sobre la cadena de formato y luego usar esa expresión regular para extraer el día, mes y año de la cadena de fecha:

function parseDate(dateStr, format) {
  const regex = format.toLocaleLowerCase()
    .replace(/\bd+\b/, '(?<day>\\d+)')
    .replace(/\bm+\b/, '(?<month>\\d+)')
    .replace(/\by+\b/, '(?<year>\\d+)')
  
  const parts = new RegExp(regex).exec(dateStr) || {};
  const { year, month, day } = parts.groups || {};
  return parts.length === 4 ? new Date(year, month-1, day) : undefined;
}

const printDate = x => console.log(x ? x.toLocaleDateString() : x);

printDate(parseDate('05/11/1896', 'dd/mm/YYYY'));
printDate(parseDate('07-12-2000', 'dd-mm-yy'));
printDate(parseDate('07:12:2000', 'dd:mm:yy'));
printDate(parseDate('2017/6/3', 'yy/MM/dd'));
printDate(parseDate('2017-6-15', 'y-m-d'));
printDate(parseDate('2015 6 25', 'y m d'));
printDate(parseDate('2015625', 'y m d')); // bad format


buena solución, pero tal vez no sepa que Firefox todavía no es compatible con los grupos con nombre RegExp - bugzilla.mozilla.org/show_bug.cgi?id=1362154 (PD: no soy yo quien rechazó su respuesta)
qdev
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.