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
Date -> Stringou String -> Date?
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
Date -> Stringou String -> Date?
Respostas:
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.
new Date('2011-04-11T11:51:00')a data criada é válida.
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').
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());
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 .
var st = "26.04.2013";
var pattern = /(\d{2})\.(\d{2})\.(\d{4})/;
var dt = new Date(st.replace(pattern,'$3-$2-$1'));
E a saída será:
dt => Date {Fri Apr 26 2013}
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","-")
.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.
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.
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.
let dt = moment("02-01-2019", "MM-DD-YYYY");console.log(dt.fromNow()+' | '+dt.format('LL')) : "há 3 meses | 1 de fevereiro de 2019"
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().
console.log(new Date('30-08-2018'))e obter data inválida
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 .
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();
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
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");
Somente new Date(st);
Supondo que seja o formato adequado .
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.
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
undefinedvalor? Como var date = new Date(undefined):?
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;
}
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 !!!
Eu criei um violino para isso, você pode usar a função toDate () em qualquer sequência de datas e fornecer o formato da data. Isso retornará um objeto Date. https://jsfiddle.net/Sushil231088/q56yd0rp/
"17/9/2014".toDate("dd/MM/yyyy", "/")
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
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
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'));
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.
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;
}
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)
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","-")
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));
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.
new Date (anúncio) é 50-100x mais rápida que moment.js (dd) para todos os navegadores para data e carimbo de data / hora ISOnew Date(anúncio) é ~ 10x mais rápida queparseDate (Ed)Date.parse(Bd) é mais rápida se precisarmos obter o carimbo de data e hora da data ISO em todos os navegadoresRealizo 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
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"
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;
}
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>
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