web-dev-qa-db-fra.com

Comment convertir une chaîne en date / heure avec la spécification de format en JavaScript?

Comment convertir une chaîne en un objet date-heure en javascript en spécifiant une chaîne de formatage?

Je cherche quelque chose comme:

var dateTime = convertToDateTime("23.11.2009 12:34:56", "dd.MM.yyyy HH:mm:ss");
193
Serhat Ozgel

Je pense que cela peut vous aider: http://www.mattkruse.com/javascript/date/

Il existe une fonction getDateFromFormat() que vous pouvez modifier un peu pour résoudre votre problème.

Mise à jour: une version mise à jour des exemples est disponible sur javascripttoolbox.com

91
Rafael Mueller

Utilisez new Date(dateString) si votre chaîne est compatible avec Date.parse() . Si votre format est incompatible (je pense que c'est le cas), vous devez analyser la chaîne vous-même (cela devrait être facile avec des expressions régulières) et créer un nouvel objet Date avec des valeurs explicites pour l'année, le mois, la date, heure, minute et seconde.

91
Christoph

@Christoph Mentionne l'utilisation d'une expression rationnelle pour résoudre le problème. Voici ce que j'utilise:

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

Ce n'est nullement intelligent, il suffit de configurer la regex et new Date(blah) pour répondre à vos besoins.

Edit: Peut-être un peu plus compréhensible dans ES6 en utilisant la déstructuration:

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

Mais en toute honnêteté, ces jours-ci, j'atteins quelque chose comme Moment

60
OrganicPanda

Aucune routine sophistiquée de formatage de date/heure n'existe en JavaScript.

Vous devrez utiliser une bibliothèque externe pour la sortie de la date formatée, "Format de date JavaScript" de Flagrant Badassery semble très prometteur.

Pour la conversion d’entrée, plusieurs suggestions ont déjà été faites. :)

14
Tomalak

Départ Moment.js . C’est une bibliothèque moderne et puissante qui compense les fonctions lamentables de JavaScript Date (ou son absence).

13
Aaron Gray

Juste pour une réponse mise à jour ici, il y a une bonne librairie js à http://www.datejs.com/

Datejs est une librairie JavaScript Date open source pour l'analyse, le formatage et le traitement.

11
Alexis Abril
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");
}
7
navin

La bibliothèque externe est une surcapacité pour analyser une ou deux dates, j'ai donc créé ma propre fonction en utilisant les solutions Oli et Christoph . Ici, en Europe centrale, nous utilisons rarement n'importe quoi sauf le format du PO, cela devrait donc suffire pour les applications simples utilisées ici.

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]));
    }
}
5
Pavel V.

Date.parse() est assez intelligent, mais je ne peux pas garantir que le format sera analysé correctement.

Si ce n'est pas le cas, il vous faudra trouver un moyen de concilier les deux. Votre exemple est assez simple (il ne s’agit que de chiffres) et une touche de REGEX (ou même string.split() - peut-être plus rapide) associée à un certain parseInt() vous permettra de créer rapidement une date.

4
Oli
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
3
puneet18

Juste pour donner mes 5 cents.

Mon format de date est jj.mm.yyyy (format britannique) et aucun des exemples ci-dessus ne fonctionnait pour moi. Tous les analyseurs considéraient mm comme jour et jj comme mois.

J'ai trouvé cette bibliothèque: http://joey.mazzarelli.com/2008/11/25/easy-date-parsing-with-javascript/ et cela a fonctionné, car vous pouvez dire la commande des champs comme ceci:

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

J'espère que cela aide quelqu'un.

2
Anton Valqk

Moment.js gérera ceci:

var momentDate = moment('23.11.2009 12:34:56', 'DD.MM.YYYY HH:mm:ss');
var date = momentDate.;
1
Chintsu
//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;
    }
0
Abhishek Kanrar

Pour satisfaire pleinement la Date.parse, convertir la chaîne au format jj-mm-AAAA comme spécifié dans la RFC822, si vous utilisez l'analyse aaaa-mm-jj, vous risquez de vous tromper.

0
Valentin Rusk