¿Cómo puedo convertir una cadena a fecha y hora con la especificación de formato en JavaScript?

208

¿Cómo puedo convertir una cadena en un objeto de fecha y hora en JavaScript especificando una cadena de formato?

Estoy buscando algo como:

var dateTime = convertToDateTime("23.11.2009 12:34:56", "dd.MM.yyyy HH:mm:ss");
Serhat Ozgel
fuente
2
Por cierto, los puntos y guiones pueden fallar como separadores de fechas, las barras están bien, así que (hasta el límite de mis pruebas) Javascript aceptará "2011/08/22 10:30:00" pero aún no (a pesar de ISO 8601) "2011-09 -02 15:58:40 "que, se afirma, es compatible con Javascript 1.8.5 en adelante.
Dave Everitt
La función Date.parse analiza la cadena de fecha que está en formato "mm / dd / aaaa". Convierta la cadena al formato "mm / dd / aaaa" antes de aplicar Parse.
¿Por qué no proporcionar la fecha en el formato requerido? Lo hago como nueva fecha ('2012 11 25 18:00:00'); ¡y funciona!
foxybagga

Respuestas:

88

Creo que esto puede ayudarte: http://www.mattkruse.com/javascript/date/

Hay una getDateFromFormat()función que puede ajustar un poco para resolver su problema.

Actualización: hay una versión actualizada de las muestras disponibles en javascripttoolbox.com

Rafael Mueller
fuente
55
TypeError: Object Date has no method 'getDateFromFormat'
Derek 朕 會 功夫
66
El método getDateFromFormat está disponible con el documento, en el enlace de arriba. Fuente disponible aquí: mattkruse.com/javascript/date/source.html
Rafael Mueller
1
+1, buena biblioteca ... JavaScript puro ... es fantástico. gracias
Surendra Jnawali
77
Ambos enlaces están muertos
Sytham
1
Si puede, actualice el enlace. Esto ya no ayuda.
Tallerlei
98

Úselo si su cadena es compatible con . Si su formato es incompatible (creo que lo es), debe analizar la cadena usted mismo (debería ser fácil con expresiones regulares) y crear un nuevo objeto Date con valores explícitos para año, mes, fecha, hora, minuto y segundo.new Date(dateString)Date.parse()

Christoph
fuente
1
Date.parse es la mejor solución! ¡Analiza casi todo! +1
ianaz
77
@ianaz: Casi todo lo que se usa en Estados Unidos, pero perder el formato utilizado por gran parte de Europa es demasiado "casi". Pero la nueva fecha es una buena base para funciones personalizadas.
Pavel V.
La nueva fecha (dateString) funcionó bien para mí, Date.parse () en su lugar se convierte a milisegundos y, por lo tanto, devuelve un número que no es un tipo de fecha.
Reagan Ochora
68

@ Christoph menciona el uso de una expresión regular para abordar el problema. Esto es lo que estoy 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])
);

De ninguna manera es inteligente, solo configure la expresión regular y se new Date(blah)adapte a sus necesidades.

Editar: Tal vez un poco más comprensible en ES6 usando la desestructuración:

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

Pero con toda honestidad en estos días alcanzo algo como Momento

OrgánicaPanda
fuente
19
@ bažmegakapa, en lugar de llorar, ¿podrías haber editado la respuesta y agregar las 'var'?
OrganicPanda
¿Por qué utiliza la /gbandera, sólo para conjunto lastIndexde 0después? Simplemente no uses una coincidencia global.
Ry-
1
@minitech The /gfue una copia / pegado descuidada de un proyecto existente. lastindexfue agregado por un editor (para combatir el \gsupongo?). Los eliminaré ahora. Gracias por señalar eso.
OrganicPanda
1
muy agradable anwer ..really útil para mí
Jethik
14

No existen rutinas sofisticadas de formato de fecha / hora en JavaScript.

Tendrá que usar una biblioteca externa para la salida de fecha formateada, "Formato de fecha JavaScript" de Flagrant Badassery parece muy prometedor.

Para la conversión de entrada, ya se han hecho varias sugerencias. :)

Tomalak
fuente
3
"tener que" es relativo. Por supuesto, puede crear su propia implementación. :)
Tomalak
13

Echa un vistazo a Moment.js . Es una biblioteca moderna y poderosa que compensa las lamentables funciones de fecha de JavaScript (o la falta de ellas).

Aaron Gray
fuente
3
No voté en contra, pero tal vez hubiera sido bueno saber exactamente qué función en Moment.js daría el comportamiento deseado (para nosotros, las personas perezosas que ya están usando Moment.js pero no conocen la función en particular) .
Matt
La localización parece prometedora, elija cualquier configuración regional centroeuropea para el formato de puntos. Sin embargo, no lo probé y el formato completo de fecha y hora no está en los ejemplos que he visto.
Pavel V.
No voté en contra, pero solo quería decir que esto es lento. Para el escritorio está bien, pero para dispositivos móviles puede ser demasiado lento (según sus necesidades).
gabn88
11

Solo para obtener una respuesta actualizada aquí, hay una buena js lib en http://www.datejs.com/

Datejs es una biblioteca de fechas JavaScript de código abierto para analizar, formatear y procesar.

Alexis Abril
fuente
Retrocedió esa edición, aunque es muy útil, debe agregarse como un comentario o una respuesta por separado.
Alexis Abril
De todos modos, fue demasiado largo para un comentario, y agregar una respuesta duplicada es incorrecto. Esta pregunta tiene más de 155,000 visitas. ¡Brindemos a estas personas tanta información como sea posible! (por cierto, es muy común en Stack Overflow editar una respuesta existente, probablemente te sentirías peor si solo copiara tu respuesta ...)
Kobi
1
Y de todos modos, si no le gusta mi edición, está bien, pero expanda su respuesta: "Solo para una respuesta actualizada aquí" es un relleno, y le faltan algunos detalles. Esta pregunta está recibiendo algo de atención en este momento, por cierto, que es la razón por la que de repente obtuviste 5 votos.
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
fuente
5

La biblioteca externa es una exageración para analizar una o dos fechas, así que hice mi propia función usando las soluciones de Oli y Christoph . Aquí en Europa central raramente usamos algo más que el formato OP, por lo que esto debería ser suficiente para aplicaciones simples utilizadas aquí.

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.
fuente
4

Date.parse() es bastante inteligente pero no puedo garantizar que el formato se analice correctamente.

Si no es así, tendrías que encontrar algo para unir los dos. Su ejemplo es bastante simple (siendo puramente números), por lo que un toque de REGEX (o incluso string.split(), podría ser más rápido) emparejado con algunos parseInt()le permitirá hacer una cita rápidamente.

Oli
fuente
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
fuente
más 1 después de llamar a la función getmonth () parece incorrecto
Arjunsingh
t.getMonth () + 1 es correcto ya que Date.getMonth () devuelve un valor basado en 0.
Jussi Palo
3

Solo para dar mis 5 centavos.

Mi formato de fecha es dd.mm.aaaa (formato del Reino Unido) y ninguno de los ejemplos anteriores funcionaba para mí. Todos los analizadores consideraban mm como día y dd como mes.

Encontré esta biblioteca: http://joey.mazzarelli.com/2008/11/25/easy-date-parsing-with-javascript/ y funcionó, porque puedes decir el orden de los campos de esta manera:

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

Espero que ayude a alguien.

Anton Valqk
fuente
Enlaces ahora muertos!
Bueno ... un archivo archive.org rápido mostró: bitbucket.org/mazzarelli/js-date/downloads es la url del proyecto.
Anton Valqk
1

Moment.js se encargará de esto:

var momentDate = moment('23.11.2009 12:34:56', 'DD.MM.YYYY HH:mm:ss');
var date = momentDate.;
Chintsu
fuente
1
Si bien moment.js es excelente, hay una gran cantidad de casos de uso en los que solo tiene que usar Javascript nativo. Mi caso de uso actual es una función de Mapa en CouchDB
Zach Smith
1

Puede usar la biblioteca moment.js para esto. Estoy usando solo para obtener resultados específicos de tiempo, pero puede seleccionar qué tipo de formato desea seleccionar.

Referencia:

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

2. funciones específicas de hora y fecha: https://timestamp.online/article/how-to-convert-timestamp-to-datetime-in-javascript

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

y puedes llamar a este método como:

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

Espero que ayude. Disfruta codificando.

amit pandya
fuente
0

Para satisfacer completamente el Date.parse, convierta la cadena al formato dd-mm-AAAA como se especifica en RFC822, si usa aaaa-mm-dd, el análisis puede cometer errores.

Valentin Rusk
fuente
FYI, del RFC 822 (página: 25. Parcialmente limpiado para cumplir con la longitud del texto para comentarios): 13 de agosto de 1982 - 25 - RFC # 822 5. FECHA Y HORA ESPECIFICACIÓN 5.1. SYNTAX date-time = [día ","] fecha hora; dd mm aa hh: mm: ss zzz day = "Lun" / "Tue" / "Wed" / "Thu" / "Fri" / "Sat" / "Sun" fecha = 1 * 2DIGIT mes 2DIGIT; día mes año por ejemplo 20 jun 82 mes = "ene" / "feb" / "mar" / "abr" / "may" / "jun" / "jul" / "ago" / "sep" / "oct" / " 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
fuente
La consulta solicitó especificar una cadena de formato .
Armali
@Armali Parámetro de entrada como "/ Fecha (1552415400000) /" en formato de cadena
Abhishek Kanrar