¿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
Date -> String
o String -> Date
?
¿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
Date -> String
o String -> Date
?
Respuestas:
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-DD
oYYYY-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.
new Date('2011-04-11T11:51:00')
la fecha de creación es válida.
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').
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());
yyyy-MM-dd
se 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 .
var st = "26.04.2013";
var pattern = /(\d{2})\.(\d{2})\.(\d{4})/;
var dt = new Date(st.replace(pattern,'$3-$2-$1'));
Y la salida 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 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.
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.
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.
let dt = moment("02-01-2019", "MM-DD-YYYY");console.log(dt.fromNow()+' | '+dt.format('LL'))
: "hace 3 meses | 1 de febrero de 2019"
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()
.
console.log(new Date('30-08-2018'))
y obtengo una fecha no válida
01/02/2020
en 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.
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();
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
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");
Sólo new Date(st);
Asumiendo que es el formato correcto .
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.
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
undefined
valor? Así como: var date = new Date(undefined)
?
Date.parse
casi 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;
}
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 !!!
He creado un violín para esto, puede usar la función toDate () en cualquier cadena de fecha y proporcionar el formato de fecha. Esto le devolverá un objeto Date. https://jsfiddle.net/Sushil231088/q56yd0rp/
"17/9/2014".toDate("dd/MM/yyyy", "/")
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
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
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'));
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;
}
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)
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","-")
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));
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.
new Date
(anuncio) es 50-100 veces más rápida que moment.js (Dd) para todos los navegadores con fecha y hora ISOnew Date
(anuncio) es ~ 10 veces más rápida queparseDate
(Ed)Date.parse
(Bd) es más rápida si es necesario obtener la marca de tiempo de la fecha ISO en todos los navegadoresRealizo 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
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"
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;
}
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>
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