Converter dd-mm-aaaa em data


184

Estou tentando converter uma seqüência de caracteres no formato dd-mm-aaaa em um objeto de data no JavaScript usando o seguinte:

 var from = $("#datepicker").val();
 var to = $("#datepickertwo").val();
 var f = new Date(from);
 var t = new Date(to);

("#datepicker").val()contém uma data no formato dd-mm-aaaa. Quando faço o seguinte, recebo "Data inválida":

alert(f);

Isso é devido ao símbolo '-'? Como posso superar isso?


Isso acontece com todas as datas ou uma em particular?
kasdega

Respostas:


326

Dividir em "-"

Analise a string nas partes necessárias:

var from = $("#datepicker").val().split("-")
var f = new Date(from[2], from[1] - 1, from[0])

Use regex

var date = new Date("15-05-2018".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3"))

Por que não usar regex?

Porque você sabe que estará trabalhando em uma corda composta de três partes, separadas por hífens.

No entanto, se você estivesse procurando a mesma sequência dentro de outra, o regex seria o caminho a seguir.

Reuso

Como você está fazendo isso mais de uma vez no seu código de exemplo e talvez em outro lugar na sua base de código, envolva-o em uma função:

function toDate(dateStr) {
  var parts = dateStr.split("-")
  return new Date(parts[2], parts[1] - 1, parts[0])
}

Usando como:

var from = $("#datepicker").val()
var to = $("#datepickertwo").val()
var f = toDate(from)
var t = toDate(to)

Ou se você não se importa com o jQuery em sua função:

function toDate(selector) {
  var from = $(selector).val().split("-")
  return new Date(from[2], from[1] - 1, from[0])
}

Usando como:

var f = toDate("#datepicker")
var t = toDate("#datepickertwo")

JavaScript moderno

Se você é capaz de usar JS mais moderno, a destruição de matriz também é um toque agradável:

const toDate = (dateStr) => {
  const [day, month, year] = dateStr.split("-")
  return new Date(year, month - 1, day)
}

9
me supere ... mas ainda uso DateJs. Isso não está exatamente correto devido a um erro no poste da cerca. o mês é de 0 a 11, então você precisa subtrair 1. f = new Date (de [2], de [1] -1, de [0]);
precisa saber é o seguinte

12
Resposta selecionada com um bug que produz datas incorretas. Impressionante!
epascarello

3
Cheers @kasdega - Editou ... há um tempo atrás!
Adrian Lynch

@AdrianLynch Como converter "Mês dd, aaaa" em "MM / dd / aaaa" em javascript?
Dilipkumar1007

1
A opção JavaScript moderna do @Adrian Lynch é ótima! Obrigado.
Alexandre Ribeiro

134

exemplo de expressão regular:

new Date( "13-01-2011".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3") );

8
Uma revisão que também leva /é delimitador e um ano feito de 2 dígitos (ou qualquer contagem maior que 1):replace( /(\d{2})[-/](\d{2})[-/](\d+)/, "$2/$1/$3")
Izhaki

1
Por que essa deveria ser a resposta selecionada @AdemirNuno? Por que usar o RegEx para uma string em um formato conhecido? Você não está procurando um padrão, sabe que o primeiro número é o dia, o segundo no mês e o terceiro no ano. RegEx é a ferramenta errada para o trabalho neste caso.
Adrian Lynch

Uma revisão que usa delimitadores sem dígito, datas sem zeros à esquerda e anos com 2 ou 4 dígitos: new Date( "23. 2. 15".replace( /(\d+)[^d]+(\d+)[^d]+(\d+)/, "$2/$1/$3") ); en.wikipedia.org/wiki/Date_format_by_country
PaulH

é tão cara de prática, obrigado. meu formato de data é fornecido com o tempo, então eu o recodifico como: 'new Date ("13-01-2011". substitua (/ (\ d {2}) - (\ d {2}) - (\ w) / , "$ 2 / $ 1 / $ 3")); ' está certo?
Kamuran Sönecek

@NeerajSingh Como converter "Month dd, aaaa" em "MM / dd / aaaa" em javascript?
Dilipkumar1007

15

Outra possibilidade:

var from = "10-11-2011"; 
var numbers = from.match(/\d+/g); 
var date = new Date(numbers[2], numbers[0]-1, numbers[1]);

Combine os dígitos e reordene-os


Além disso, a pergunta original especificava "dd-mm-aaaa", não "mm-dd-aaaa", portanto ainda está errada (mas apenas).
Phil M Jones

@epascarello Como converter "Month dd, aaaa" em "MM / dd / aaaa" em javascript?
Dilipkumar1007

1
var date = new Date(numbers[2], numbers[1]-1, numbers[0]);
Rui Nunes

7

Usando moment.js exemplo:

var from = '11-04-2017' // OR $("#datepicker").val();
var milliseconds = moment(from, "DD-MM-YYYY").format('x');
var f = new Date(milliseconds)

1
momento (de, "DD-MM-AAAA"). toDate ()
Lapenkov Vladimir

6
var from = $("#datepicker").val(); 
var f = $.datepicker.parseDate("d-m-Y", from);

3
Você está recebendo Date.parseDate?
kasdega

@kasdega Desculpe, eu estava pensando em $ .datepicker.parseDate, corrigi-lo agora :)
Saad Imran.

Você deve usar $.datepicker.parseDate("dd-mm-yy", from);para analisar corretamente uma data como 24-01-2017, documentação datepicker chek em api.jqueryui.com/datepicker
Andrea Mauro

4

Você também pode escrever uma data entre parênteses do Date()objeto, como estes:

new Date("Month dd, yyyy hh:mm:ss")
new Date("Month dd, yyyy")
new Date(yyyy,mm,dd,hh,mm,ss)
new Date(yyyy,mm,dd)
new Date(milliseconds)

@AmitSengar Como converter "Month dd, aaaa" em "MM / dd / aaaa" em javascript?
Dilipkumar1007

3

Use este formato: myDate = new Date('2011-01-03'); // Mon Jan 03 2011 00:00:00


1
De onde você tirou essa parseDatefunção? Essa é uma função javascript nativa?
Joseph Silber

desculpe como faço para implementar isso? também preciso do formato como dd-mm-aa
user559142

parseDate é uma função JS nativa. Para mais informações consulte: xaprb.com/articles/javascript-date-parsing-demo.html
Diodeus - James MacFarlane

1
@Diodeus ... realmente é nativo? como é que ff e chrome lançam erros?
epascarello

2
O @Diodeus, mesmo com a última edição, não funciona para mim (pelo menos com o Chrome). Ele define a data '2011-01-03'e a hora UTC para 00:00:00. Portanto, se o fuso horário do usuário for menor que o UTC, será na véspera.
23414 Mike

3

No meu caso

new Date("20151102034013".replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/, "$1-$2-$3T$4:$5:$6"))

Resultado: segunda-feira, 02 de novembro de 2015, 04:40:13 GMT + 0100 (CET), então eu uso .getTime () para trabalhar com milissegundos


3

A resposta aceita meio que tem um bug

var from = $("#datepicker").val().split("-")
var f = new Date(from[2], from[1] - 1, from[0])

Considere se o datepicker contém "77-78-7980", que obviamente não é uma data válida. Isso resultaria em:

var f = new Date(7980, 77, 77);
=> Date 7986-08-15T22:00:00.000Z

O que provavelmente não é o resultado desejado.

A razão para isso é explicada no site MDN :

Onde Date é chamado como construtor com mais de um argumento, se os valores forem maiores que seu intervalo lógico (por exemplo, 13 é fornecido como o valor do mês ou 70 para o valor do minuto), o valor adjacente será ajustado. Por exemplo, new Date(2013, 13, 1)é equivalente a new Date(2014, 1, 1).


Uma maneira melhor de resolver o problema é:

const stringToDate = function(dateString) {
  const [dd, mm, yyyy] = dateString.split("-");
  return new Date(`${yyyy}-${mm}-${dd}`);
};

console.log(stringToDate('04-04-2019'));
// Date 2019-04-04T00:00:00.000Z

console.log(stringToDate('77-78-7980'));
// Invalid Date

Isso lhe dá a possibilidade de lidar com entradas inválidas.

Por exemplo:

const date = stringToDate("77-78-7980");

if (date === "Invalid Date" || isNaN(date)) {
  console.log("It's all gone bad");
} else {
  // Do something with your valid date here
}


1

Dê uma olhada no Datejs para todos os problemas relacionados à data mesquinha. Você também pode resolver isso pela função parseDate


0

Você poderia usar um Regexp.

var result = /^(\d{2})-(\d{2})-(\d{4})$/.exec($("#datepicker").val());
if (result) {
    from = new Date(
        parseInt(result[3], 10), 
        parseInt(result[2], 10) - 1, 
        parseInt(result[1], 10)
    );
}

Produz o mês errado! Os meses começam em zero, não em um. Então, se você aceitasse Jan, o seu diria Fev.
epascarello 22/08/11

1
@epascarello - Esqueceu o quão ruim é a API do Date.
precisa saber é o seguinte

@ChaosPandion: como converter myDate = '20 / 06/17 'para o formato '20 / 6/2017 00:00:00' em javascript?
Ghanshyam Lakhani

-1
new Date().toLocaleDateString();

simples assim, basta passar sua data para js Date Object


Você quer dizer passar a string de data dentro do construtor Date, como new Date('30/12/2018').toLocaleDateString()? Isso retorna Data inválida
Ms.Tamil 3/18/18
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.