Como posso converter string para datetime com especificação de formato em JavaScript?

208

Como posso converter uma string em um objeto de data e hora em javascript, especificando uma string de formato?

Estou procurando algo como:

var dateTime = convertToDateTime("23.11.2009 12:34:56", "dd.MM.yyyy HH:mm:ss");
Serhat Ozgel
fonte
2
Os pontos e hífens de BTW podem falhar como separadores de data; as barras são aceitáveis; portanto, (nos limites dos meus testes), o Javascript aceitará "2011/08/22 10:30:00", mas ainda não (apesar da ISO 8601) "2011-09 -02 15:58:40 "que - afirma-se - é suportado no Javascript 1.8.5 em.
Dave Everitt
A função Date.parse analisa a string de data no formato "mm / dd / aaaa". Converta a string no formato "mm / dd / aaaa" antes de aplicar o Parse.
Por que não fornecer a data no formato necessário? Faço como nova data ('2012 11 25 18:00:00'); e funciona!
foxybagga

Respostas:

88

Acho que isso pode ajudá-lo: http://www.mattkruse.com/javascript/date/

Há uma getDateFromFormat()função que você pode ajustar um pouco para resolver seu problema.

Atualização: há uma versão atualizada das amostras disponíveis em javascripttoolbox.com

Rafael Mueller
fonte
5
TypeError: Object Date has no method 'getDateFromFormat'
Derek朕會功夫
6
O método getDateFromFormat está disponível com o documento, no link acima. Fonte disponível aqui: mattkruse.com/javascript/date/source.html
Rafael Mueller
1
+1, boa biblioteca .. javascript puro ... é fantástico. obrigado
Surendra Jnawali
7
Ambos os links estão inoperantes
Sytham 13/12/19
1
Se puder, atualize o link. Isso não ajuda mais.
Tallerlei 24/03
98

Use se sua string for compatível com . Se o seu formato for incompatível (eu acho que é), você deverá analisar a string (deve ser fácil com expressões regulares) e criar um novo objeto Date com valores explícitos para ano, mês, data, hora, minuto e segundo.new Date(dateString)Date.parse()

Christoph
fonte
1
Date.parse é a melhor solução! Analisa quase tudo! 1
ianaz 30/08/2012
7
@ianaz: QUASE tudo o que é usado nos Estados Unidos, mas a falta do formato usado por grande parte da Europa é grande demais "quase". Mas a nova data é uma boa base para funções personalizadas.
Pavel V.
new Date (dateString) funcionou bem para mim; em vez disso, Date.parse () converte em milissegundos e, portanto, retorna um número que não é do tipo Date.
Reagan Ochora
68

@Christoph Menções usando um regex para resolver o problema. Aqui está o que estou usando:

var dateString = "2010-08-09 01:02:03";
var reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/;
var dateArray = reggie.exec(dateString); 
var dateObject = new Date(
    (+dateArray[1]),
    (+dateArray[2])-1, // Careful, month starts at 0!
    (+dateArray[3]),
    (+dateArray[4]),
    (+dateArray[5]),
    (+dateArray[6])
);

Não é inteligente, basta configurar o regex e new Date(blah)atender às suas necessidades.

Edit: Talvez um pouco mais compreensível no ES6 usando a desestruturação:

let dateString = "2010-08-09 01:02:03"
  , reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/
  , [, year, month, day, hours, minutes, seconds] = reggie.exec(dateString)
  , dateObject = new Date(year, month-1, day, hours, minutes, seconds);

Mas com toda a honestidade, hoje em dia, busco algo como Moment

OrganicPanda
fonte
19
@ bažmegakapa, em vez de chorar, você poderia ter editado a resposta e adicionado o 'var's você mesmo?
OrganicPanda
Por que você está usando a /gbandeira, apenas para set lastIndexpara 0depois? Só não use uma correspondência global.
Ry-
1
@minitech A /gcópia / pasta era desleixada de um projeto existente. lastindexfoi adicionado por um editor (para combater o que \geu suponho?). Vou removê-los agora. Obrigado por apontar isso.
OrganicPanda
1
muito agradável anwer ..really útil para mim
Jethik
14

Não existem rotinas sofisticadas de formatação de data / hora em JavaScript.

Você precisará usar uma biblioteca externa para a saída da data formatada, "JavaScript Date Format" do Flagrant Badassery parece muito promissor.

Para a conversão de entrada, várias sugestões já foram feitas. :)

Tomalak
fonte
3
"tem que" é relativo. Claro que você pode criar sua própria implementação. :)
Tomalak
13

Confira Moment.js . É uma biblioteca moderna e poderosa que compensa as lamentáveis ​​funções de data do JavaScript (ou a falta dela).

Aaron Gray
fonte
3
Não diminuí a votação, mas talvez fosse bom saber exatamente qual função do Moment.js daria o comportamento desejado (para nós, pessoas preguiçosas que já estão usando o Moment.js, mas não conhecem a função específica a ser usada) .
Matt
A localização parece promissora, escolha qualquer local da Europa Central para o formato de ponto. No entanto, não testei e o formato completo de data e hora não está nos exemplos que vi.
Pavel V.
Não diminuí a votação, mas só queria dizer que isso é lento. Para computadores, ok, mas para dispositivos móveis pode ser muito lento (dependendo das suas necessidades).
gabn88
11

Apenas para uma resposta atualizada aqui, há uma boa biblioteca js em http://www.datejs.com/

Datejs é uma biblioteca JavaScript Date de código aberto para análise, formatação e processamento.

Alexis Abril
fonte
Revertida essa edição, embora muito útil, ela deve ser adicionada como um comentário ou resposta separada.
Alexis Abril
De qualquer maneira, foi muito longo para um comentário e a adição de uma resposta duplicada está errada. Esta pergunta tem mais de 155.000 visualizações - vamos dar a essas pessoas o máximo de informação possível! (a propósito - é muito comum em Stack Overflow para editar uma resposta existente - você provavelmente se sentiria pior se eu simplesmente copiou a sua resposta ...)
Kobi
1
De qualquer forma, se você não gostar da minha edição, tudo bem, mas expanda sua resposta - "Apenas para uma resposta atualizada aqui" é um preenchimento e faltam alguns detalhes. A propósito, esta questão está recebendo alguma atenção no momento, e é por isso que você obteve 5 votos de repente.
Kobi
7
var temp1 = "";
var temp2 = "";

var str1 = fd; 
var str2 = td;

var dt1  = str1.substring(0,2);
var dt2  = str2.substring(0,2);

var mon1 = str1.substring(3,5);
var mon2 = str2.substring(3,5);

var yr1  = str1.substring(6,10);  
var yr2  = str2.substring(6,10); 

temp1 = mon1 + "/" + dt1 + "/" + yr1;
temp2 = mon2 + "/" + dt2 + "/" + yr2;

var cfd = Date.parse(temp1);
var ctd = Date.parse(temp2);

var date1 = new Date(cfd); 
var date2 = new Date(ctd);

if(date1 > date2) { 
    alert("FROM DATE SHOULD BE MORE THAN TO DATE");
}
navin
fonte
5

A biblioteca externa é um exagero para analisar uma ou duas datas, por isso criei minha própria função usando as soluções de Oli e Christoph . Aqui na Europa central, raramente usamos nada além do formato do OP, portanto isso deve ser suficiente para aplicativos simples usados ​​aqui.

function ParseDate(dateString) {
    //dd.mm.yyyy, or dd.mm.yy
    var dateArr = dateString.split(".");
    if (dateArr.length == 1) {
        return null;    //wrong format
    }
    //parse time after the year - separated by space
    var spacePos = dateArr[2].indexOf(" ");
    if(spacePos > 1) {
        var timeString = dateArr[2].substr(spacePos + 1);
        var timeArr = timeString.split(":");
        dateArr[2] = dateArr[2].substr(0, spacePos);
        if (timeArr.length == 2) {
            //minutes only
            return new Date(parseInt(dateArr[2]), parseInt(dateArr[1]-1), parseInt(dateArr[0]), parseInt(timeArr[0]), parseInt(timeArr[1]));
        } else {
            //including seconds
            return new Date(parseInt(dateArr[2]), parseInt(dateArr[1]-1), parseInt(dateArr[0]), parseInt(timeArr[0]), parseInt(timeArr[1]), parseInt(timeArr[2]))
        }
    } else {
        //gotcha at months - January is at 0, not 1 as one would expect
        return new Date(parseInt(dateArr[2]), parseInt(dateArr[1] - 1), parseInt(dateArr[0]));
    }
}
Pavel V.
fonte
4

Date.parse() é bastante inteligente, mas não posso garantir que o formato seja analisado corretamente.

Caso contrário, você teria que encontrar algo para unir os dois. Seu exemplo é bastante simples (sendo apenas números), portanto, um toque de REGEX (ou até string.split()- pode ser mais rápido) emparelhado com alguns parseInt()permitirá que você faça uma data rapidamente.

Oli
fonte
4
time = "2017-01-18T17:02:09.000+05:30"

t = new Date(time)

hr = ("0" + t.getHours()).slice(-2);
min = ("0" + t.getMinutes()).slice(-2);
sec = ("0" + t.getSeconds()).slice(-2);

t.getFullYear()+"-"+t.getMonth()+1+"-"+t.getDate()+" "+hr+":"+min+":"+sec
puneet18
fonte
mais 1 depois de chamar o getMonth function () parece errado
Arjun Singh
t.getMonth () + 1 está correto, pois Date.getMonth () retorna 0 valor baseado.
Jussi Palo
3

Só para dar meus 5 centavos.

Meu formato de data é dd.mm.aaaa (formato do Reino Unido) e nenhum dos exemplos acima estava funcionando para mim. Todos os analisadores estavam considerando mm como dia e dd como mês.

Encontrei esta biblioteca: http://joey.mazzarelli.com/2008/11/25/easy-date-parsing-with-javascript/ e funcionou, porque você pode dizer a ordem dos campos como este:

>>console.log(new Date(Date.fromString('09.05.2012', {order: 'DMY'})));
Wed May 09 2012 00:00:00 GMT+0300 (EEST)

Espero que ajude alguém.

Anton Valqk
fonte
Links agora mortos!
Bem ... um rápido archive.org mostrou: bitbucket.org/mazzarelli/js-date/downloads é o URL do projeto.
Anton Valqk
1

Moment.js tratará disso:

var momentDate = moment('23.11.2009 12:34:56', 'DD.MM.YYYY HH:mm:ss');
var date = momentDate.;
Chintsu
fonte
1
Embora o moment.js seja ótimo, há uma infinidade de casos de uso em que você precisa usar apenas Javascript nativo. Meu caso de uso corrente é uma função Mapa no CouchDB
Zach Smith
1

Você pode usar a biblioteca moment.js para isso. Estou usando apenas para obter uma saída específica de hora, mas você pode selecionar o tipo de formato que deseja selecionar.

Referência:

1. biblioteca de momentos: https://momentjs.com/

2. funções específicas de hora e data: https://timestamp.online/article/how-to-convert-timestamp-to-datetime-in-javascript

convertDate(date) {
        var momentDate = moment(date).format('hh : mm A');
        return momentDate;
}

e você pode chamar esse método como:

this.convertDate('2020-05-01T10:31:18.837Z');

Espero que ajude. Aproveite a codificação.

amit pandya
fonte
0

Para satisfazer totalmente o Date.parse, converta a string no formato dd-mm-AAAA, conforme especificado na RFC822, se você usar a análise aaaa-mm-dd, poderá cometer erros.

Valentin Rusk
fonte
FYI, da RFC 822 (página: 25. Parcialmente limpo para encontrar o tamanho do texto para comentar): 13 de agosto de 1982 - 25 - RFC # 822 5. ESPECIFICAÇÃO DE DATA E HORA 5.1. SYNTAX date-time = [dia ","] data e hora; dd mm aa aa hh: mm: ss zzz dia = "Seg" / "Ter" / "Qua" / "Qui" / "Sex" / "Sáb" / "Dom" data = 1 * 2DIGIT mês 2DIGIT; dia mês ano, por exemplo, 20 de junho 82 meses = "jan" / "fev" / "mar" / "abr" / "maio" / "jun" / "jul" / "ago" / "set" / "out" / " Nov "/" Dec "
Valentin Rusk
0
//Here pdate is the string date time
var date1=GetDate(pdate);
    function GetDate(a){
        var dateString = a.substr(6);
        var currentTime = new Date(parseInt(dateString ));
        var month =("0"+ (currentTime.getMonth() + 1)).slice(-2);
        var day =("0"+ currentTime.getDate()).slice(-2);
        var year = currentTime.getFullYear();
        var date = day + "/" + month + "/" + year;
        return date;
    }
Abhishek Kanrar
fonte
O consultor solicitou a especificação de uma sequência de formato .
Armali
@Armali Parâmetro de entrada como "/ Date (1552415400000) /" no formato de string
Abhishek Kanrar