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

StackOverflow https://stackoverflow.com/questions/476105

Pregunta

¿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");
¿Fue útil?

Solución

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

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

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

Otros consejos

Use new Date ( dateString ) si su cadena es compatible con Date.parse () . 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.

@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 new Date (blah) para satisfacer 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 busco algo así como Momento

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

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

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

Consulte Moment.js . Es una biblioteca moderna y poderosa que compensa las lamentables funciones de Fecha de JavaScript (o la falta de ellas).

Solo para 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.

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

La biblioteca externa es una exageración para analizar una o dos fechas, así que hice mi propia función usando Oli's y Soluciones de Christoph . Aquí en Europa central raramente usamos algo más que el formato de 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]));
    }
}

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 (son puramente números), por lo que un toque de REGEX (o incluso string.split () - podría ser más rápido) emparejado con algún parseInt () Permitirle hacer una cita rápidamente.

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

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.

He encontrado 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 eso ayude a alguien.

Moment.js se encargará de esto:

var momentDate = moment('23.11.2009 12:34:56', 'DD.MM.YYYY HH:mm:ss');
var date = momentDate.;

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

//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;
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top