Convertendo uma string para uma data em JavaScript


669

Como posso converter uma string para uma data em JavaScript?

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

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


1
Oh, eu estou confuso agora. Você quer Date -> Stringou String -> Date?
Felix Kling #

Respostas:


828

O melhor formato de sequência para análise de sequência é o formato ISO da data junto com o construtor do objeto Data JavaScript.

Exemplos de formato ISO: YYYY-MM-DDou YYYY-MM-DDTHH:MM:SS.

Mas espere! O simples uso do "formato ISO" não funciona por si só de maneira confiável. Às vezes, as cadeias de caracteres são analisadas como UTC e outras como horário local (com base no fornecedor e na versão do navegador). A melhor prática deve sempre ser armazenar datas como UTC e fazer cálculos como UTC.

Para analisar uma data como UTC, anexar um Z - por exemplo: new Date('2011-04-11T10:20:30Z').

Para exibir uma data no UTC, use .toUTCString(),
para exibir uma data na hora local do usuário, use .toString().

Mais informações sobre MDN | Data e esta resposta .

Para compatibilidade Internet idade Explorer (versões do IE inferior a 9 não suporta o formato ISO no construtor Data), você deve dividir datetime representação de cadeia para as suas partes e, em seguida, você pode usar construtor usando data e hora peças, por exemplo: new Date('2011', '04' - 1, '11', '11', '51', '00'). Observe que o número do mês deve ser 1 a menos.


Método alternativo - use uma biblioteca apropriada:

Você também pode aproveitar a biblioteca Moment.js que permite analisar a data com o fuso horário especificado.


Eu também tive que usar o método "dividir a string" no safari para o mesmo problema de "Nan" que Paul Tomblin levantou. nova data ('2011-04-11 11:51:00') retornaria 'data inválida'.
Amos

1
@ Amos: Observe a letra T, que separa a data e a hora. Se você escrever new Date('2011-04-11T11:51:00')a data criada é válida.
Pavel Hodek

Infelizmente, me deparei com a questão de que * não funciona para TODOS os usuários .
Roman Podlinov

3
Deixar Data analisar uma string é a pior maneira de criar um objeto Date. Muito melhor analisar a string manualmente e chamar Date como um construtor. Alguns navegadores tratam uma string ISO sem fuso horário como UTC, outros como local.
RobG

6
@ Ben Taliadoros: Sim, é inválido em todos os navegadores comuns, new Date('1970-30-02')é uma data inválida porque não há 30 meses em um ano. Você não pode transbordar meses, mas quando transborda dias, ele resolve em Chrome e Firefox para uma data válida: new Date('1970-02-30')é o mesmo dia da nova data ('1970-03-02').
Pavel Hodek

291

Infelizmente eu descobri que

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

retorna "quarta-feira, 02 de abril de 2014". Eu sei que parece loucura, mas acontece para alguns usuários.

A solução à prova de balas é a seguinte:

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
Não é nada louco, é provável que o ajuste seja causado pelo início do horário de verão . As datas no formato de yyyy-MM-ddsão analisadas como UTC e toString retorna a hora local, portanto, dependendo do fuso horário do usuário, pode definitivamente retornar resultados diferentes. Se sempre quiser a hora como UTC, use toUTCString .
James

Estou batendo minha cabeça neste. Isso parece funcionar, mas não entendo por que você usou as partes [0] -1 e não apenas as partes [0].
Adam Youngers

4
@AdamYoungers Devido ao JavaScript contagens meses de 0: Janeiro - 0, fevereiro - 1, etc
Roman Podlinov

1
Esta resposta sugere que o comportamento no exemplo está incorreto. Per a especificação: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... (ver: DateString) o valor outputed no exemplo seria correto
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
Alças datas de cada variação não apenas US formatação
Mark Jones

4
@ MarkJones Não confie no .indexOf()método, pois ele não é compatível com vários navegadores sem polyfils. Em vez disso, use os métodos JS mais compatíveis .match()ou .test()vanilla JS.
Alexander Dixon

1
Adicionando var _delimiter = _format.match(/\W/g)[0];no início da função, você pode obter o delimitador automaticamente e pré-selecionar o terceiro parâmetro.
campsjos

39

O moment.js ( http://momentjs.com/ ) é um pacote completo e bom para datas de uso e suporta strings ISO 8601 .

Você pode adicionar uma data e formato de string.

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

E você pode verificar se uma data é válida.

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

Alguns exemplos de exibição

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

Consulte a documentação http://momentjs.com/docs/#/parsing/string-format/

Recomendação: eu recomendo usar um pacote para datas que contêm muitos formatos, porque o gerenciamento de fuso horário e formato é realmente um grande problema, no momento em que resolvemos muitos formatos. Você pode analisar facilmente a data de uma string simples até a data, mas acho que é um trabalho difícil oferecer suporte a todos os formatos e variações de datas.


1
Alguns exemplos de exibição mostram let dt = moment("02-01-2019", "MM-DD-YYYY");console.log(dt.fromNow()+' | '+dt.format('LL')) : "há 3 meses | 1 de fevereiro de 2019"
CPHPython 10/10/19

36

Passe como argumento para Date ():

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

Você pode acessar a data, mês, ano, utilizando, por exemplo: dt.getMonth().


8
eu faço console.log(new Date('30-08-2018'))e obter data inválida
Dwigh

Esta resposta ignora várias complexidades desse problema; por exemplo, se eu fizer isso por uma data 01/02/2020no meu computador (no Reino Unido), ele retornará em 1º de fevereiro, onde, como se a mesma coisa fosse feita nos EUA, retornaria em 2 de janeiro. Você nunca deve usar essa implementação ingênua. Use o momento .
Liam

23

Se você pode usar a fantástica biblioteca de momentos (por exemplo, em um projeto Node.js.), pode facilmente analisar sua data usando, por exemplo,

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

e pode acessar o objeto de data JS via

momentDate ().toDate();

5
Por favor note que momento funciona muito bem sem nó
Shaheer

Eu recebi o erro NaN nos meus dispositivos Android e IOS enquanto usava esse código, no entanto, ele estava trabalhando na área de trabalho. aqui está o código que eu estava usando antes: var dateTimeOfTimeIn = new Date (ano + "-" + mês + "-" + dia + "T" + data.timeIn); usando essa abordagem e a biblioteca de momentos, meu problema foi resolvido e meu código agora está funcionando bem em todos os meus dispositivos!
Mehdi

20

new Date(2000, 10, 1) você receberá "Wed 01 de novembro de 2000 00:00:00 GMT + 0100 (CET)"

Veja que 0 por mês fornece janeiro


19

Para quem procura uma solução pequena 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);
};

Exemplo:

"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 como um encanto! Você salvou minha vida cara!
Steve Nosse 29/08/19


12

Se você deseja converter do formato "dd / MM / aaaa". Aqui está um exemplo:

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 solução funciona nas versões do IE inferiores a 9.


12

Os carimbos de data e hora devem ser convertidos em um 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
E o undefinedvalor? Como var date = new Date(undefined):?
precisa

O @BennyNeugebauer também verifica se um valor está indefinido antes de tentar transmiti-lo ao construtor Date. Talvez você queira lançar uma exceção ou queira retornar a uma data padrão, quem sabe?
Lucky Soni

9

Date.parsequase consegue o que você quer. Ele engasga com a parte am/ pm, mas com alguns hackers você pode fazê-lo funcionar:

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

Converta para o 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 ajudar alguém !!!



4

Para converter string para data em js, eu 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 () por padrão assume a data atual. Como formatar uma string no formato "2016-06-27 17: 49: 51.951602 + 05: 30" usando o momento.
Zoran777

4

Eu criei essa função para converter qualquer objeto Date em um objeto Date UTC.

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


dateToUTC(new Date());

3

Ainda outra maneira de fazer isso:

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! Arrumado! Finalmente, um código que cuida de qualquer separador usado.
Sam Sirry 10/11/19

3

Você pode tentar isso:

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

ou

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

a string de data no formato '01 -01-1970 'não funcionará no FireFox; portanto, use "/" em vez de "-" na string de formato de data.


minha string é "2015/08/03 13:06:16" strill no FF ele não está funcionando
Dhara

2

Se você precisar verificar o conteúdo da sequência antes de converter para o formato Data:

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

Eu criei a função parseDateTime para converter a string em objeto de data e ela está funcionando em todos os navegadores (incluindo o navegador IE), verifique se alguém é necessário, consulte https://github.com/Umesh-Markande/Parse-String-to-Date -em-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 funcionou para mim. Obrigado.
Christopher D. Emerson

2

Esta resposta é baseada na resposta de Kassem, mas também lida com anos de dois dígitos. Enviei uma edição à resposta de Kassem, mas, caso não tenha sido aprovada, também a envio como resposta 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

Você pode usar regex para analisar a seqüência de caracteres para detalhar a hora e criar a data ou qualquer 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

atuação

Hoje (20.05.2018) realizo testes para soluções escolhidas - para dois casos: a data de entrada é a sequência ISO8601 (anúncio, CD, CD, Dd, Ed) e a data de entrada é o carimbo de data / hora (At, Ct, Dt). As soluções Bd, Cd, Ct não retornam o objeto js Date como resultados, mas eu as adiciono porque podem ser úteis, mas não as comparo com soluções válidas. Esses resultados podem ser úteis para a análise massiva de datas.

Conclusões

  • Solução new Date (anúncio) é 50-100x mais rápida que moment.js (dd) para todos os navegadores para data e carimbo de data / hora ISO
  • A solução new Date(anúncio) é ~ 10x mais rápida queparseDate (Ed)
  • A solução Date.parse(Bd) é mais rápida se precisarmos obter o carimbo de data e hora da data ISO em todos os navegadores

insira a descrição da imagem aqui

Detalhes

Realizo teste no MacOs High Sierra 10.13.6 no Chrome 81.0, Safari 13.1, Firefox 75.0. Solução parseDate(Ed) use new Date(0)e defina manualmente os componentes da data UTC.

Resultados para chrome

insira a descrição da imagem aqui


0

As cadeias de dados ISO 8601-esque, tão excelentes quanto o padrão, ainda não são amplamente suportadas.

Este é um ótimo recurso para descobrir qual formato de cadeia de dados você deve usar:

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

Sim, isso significa que sua cadeia de dados pode ser tão simples quanto oposta a

"2014/10/13 23:57:52" ao invés 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: (meu problema foi resolvido com 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 a sua resposta
Mazz

Os parâmetros date1 e date2 devem ter o formato como data correta.
Fetra 20/04

a data de retorno da função chamada diff. Se você quiser o número de dias retornado, faça o seguinte: var result = dateDiff (date1, date2); var day_number = result.day; é fácil
Fetra

0

Eu escrevi uma função reutilizável que eu uso quando recebo seqüências de datas do servidor.
você pode passar o delimitador desejado (/ - etc.) que separa o dia mês e ano para usar o split()método.
você pode ver e testá-lo neste exemplo de trabalho .

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

Ainda outra maneira de fazer isso é criar uma regex com grupos de captura nomeados sobre a cadeia de caracteres de formato e, em seguida, usar essa regex para extrair o dia, mês e ano da cadeia de datas:

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


boa solução, mas talvez você não está ciente de que o Firefox ainda não suporta grupos nomeados RegExp - bugzilla.mozilla.org/show_bug.cgi?id=1362154 (PS: não sou eu que downvoted sua resposta)
qdev
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.