Comment convertir string en datetime avec spécification de format en JavaScript?

Comment puis-je convertir une chaîne de caractères en objet date time en javascript en spécifiant une chaîne de format?

je cherche quelque chose comme:

var dateTime = convertToDateTime("23.11.2009 12:34:56", "dd.MM.yyyy HH:mm:ss");
188
demandé sur Serhat Ozgel 2009-01-24 17:56:46

13 réponses

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

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

mise à jour: il y a une version mise à jour des échantillons disponibles à javascripttoolbox.com

88
répondu Rafael Mueller 2012-11-12 13:26:39

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 de caractères 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 Année, Mois, date, Heure, minute et seconde.

85
répondu Christoph 2012-08-31 14:35:31

@Christoph mentionne l'utilisation d'un regex pour s'attaquer au 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 pas intelligent, il suffit de configurer le regex et new Date(blah) pour répondre à vos besoins.

Edit: Peut-être un peu plus compréhensible dans l'ES6 à l'aide de 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

57
répondu OrganicPanda 2015-12-31 11:09:15

il n'existe pas de routines sophistiquées de formatage date/heure en JavaScript.

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

pour la conversion des entrées, plusieurs suggestions ont déjà été faites. :)

14
répondu Tomalak 2009-01-24 15:14:43

Check out Moment.js . Il s'agit d'une bibliothèque moderne et puissante qui compense les fonctions de Date déplorables de JavaScript (ou leur absence).

13
répondu Aaron Gray 2014-06-19 23:37:04

juste pour une réponse à jour ici, il y a un bon js lib à http://www.datejs.com/

11
répondu Alexis Abril 2012-08-31 19:32:31
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
répondu navin 2015-08-28 14:52:21

bibliothèque externe est un surmenage pour l'analyse d'une ou deux dates, donc j'ai fait ma propre fonction en utilisant Oli et Christoph solutions. Ici en Europe centrale, nous utilisons rarement aything mais le format de L'OP, ce qui devrait être suffisant 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]));
    }
}
4
répondu Pavel V. 2017-05-23 12:18:30

Date.parse() est assez intelligent mais je ne peux pas garantir que le format se parsèmera correctement.

si ce n'est pas le cas, il faut trouver quelque chose pour les relier. Votre exemple est assez simple (étant purement des nombres) donc une touche de REGEX (ou même string.split() -- pourrait être plus rapide) jumelée avec un peu de parseInt() vous permettra de faire rapidement une date.

3
répondu Oli 2009-01-24 15:11:36

juste pour donner mes 5 cents.

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

j'ai trouvé cette bibliothèque: http://joey.mazzarelli.com/2008/11/25/easy-date-parsing-with-javascript / et cela a fonctionné, parce que vous pouvez dire l'ordre 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 aide à quelqu'un.

2
répondu Anton Valqk 2017-08-02 11:35:12

Moment.js s'occupera de ceci:

var momentDate = moment('23.11.2009 12:34:56', 'DD.MM.YYYY HH:mm:ss');
var date = momentDate.;
1
répondu Chintsu 2016-06-11 20:21:52

pour respecter pleinement la Date .parse convertissez la chaîne au format JJ-mm-AAAA comme spécifié dans RFC822, si vous utilisez aaaa-mm-jj analyser peut faire des erreurs.

0
répondu Valentin Rusk 2011-12-26 10:27:52
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
0
répondu puneet18 2017-01-18 11:54:55