Comment puis-je convertir une chaîne en datetime avec une spécification de format en JavaScript?

208

Comment puis-je convertir une chaîne en objet date-heure 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");
Serhat Ozgel
la source
2
Les points et les traits d'union BTW peuvent échouer en tant que séparateurs de date, les barres obliques sont correctes, donc (dans les limites de mes tests) Javascript acceptera "2011/08/22 10:30:00" mais pas encore (malgré ISO 8601) "2011-09 -02 15:58:40 "qui - prétend-on - est pris en charge par Javascript 1.8.5.
Dave Everitt
La fonction Date.parse analyse la chaîne de date au format "mm / jj / aaaa". Veuillez convertir la chaîne au format "mm / jj / aaaa" avant d'appliquer l'analyse.
Pourquoi ne pas fournir la date dans le format requis? Je le fais comme une nouvelle date ('2012 11 25 18:00:00'); et il fonctionne!
foxybagga

Réponses:

88

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

Il y a une getDateFromFormat()fonction 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

Rafael Mueller
la source
5
TypeError: Object Date has no method 'getDateFromFormat'
Derek 朕 會 功夫
6
La méthode getDateFromFormat est disponible avec la doc, sur le lien ci-dessus. Source disponible ici: mattkruse.com/javascript/date/source.html
Rafael Mueller
1
+1, bonne bibliothèque .. pur javascript ... c'est fantastique. merci
Surendra Jnawali
7
Les deux liens sont morts
Sytham
1
Si vous le pouvez, veuillez mettre à jour le lien. Cela n'aide plus.
Tallerlei
98

Utilisez si votre chaîne est compatible avec . 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, l'heure, la minute et la seconde.new Date(dateString)Date.parse()

Christoph
la source
1
Date.parse est la meilleure solution! Il analyse presque tout! +1
ianaz
7
@ianaz: PRESQUE tout ce qui est utilisé en Amérique, mais manquer le format utilisé par une grande partie de l'Europe est trop grand "presque". Mais la nouvelle date est une bonne base pour les fonctions personnalisées.
Pavel V.
la nouvelle Date (dateString) a bien fonctionné pour moi, Date.parse () se convertit à la place en millisecondes et renvoie donc un nombre et non un type de date.
Reagan Ochora
68

@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 en aucun cas intelligent, il suffit de configurer l'expression régulière et new Date(blah)de l'adapter à 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, je cherche quelque chose comme Moment

OrganicPanda
la source
19
@ bažmegakapa au lieu de pleurer, vous auriez peut-être pu éditer la réponse et ajouter le 'var's vous-même?
OrganicPanda
Pourquoi utilisez - vous le /gdrapeau, pour ensemble lastIndexà la 0suite? N'utilisez simplement pas de correspondance globale.
Ry-
1
@minitech The /gétait un copier / coller bâclé d'un projet existant. lastindexa été ajouté par un éditeur (pour combattre le \gje suppose?). Je vais les supprimer maintenant. Merci d'avoir fait remarquer cela.
OrganicPanda
1
très belle réponse ... vraiment utile pour moi
Jethik
14

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

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

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

Tomalak
la source
3
"devoir" est relatif. Bien sûr, vous pouvez créer votre propre implémentation. :)
Tomalak
13

Découvrez Moment.js . Il s'agit d'une bibliothèque moderne et puissante qui compense les mauvaises fonctions de date de JavaScript (ou leur absence).

Aaron Gray
la source
3
Je n'ai pas downvote, mais peut-être qu'il aurait été bien de savoir exactement quelle fonction dans Moment.js donnerait le comportement souhaité (pour nous les paresseux qui utilisent déjà Moment.js mais ne connaissent pas la fonction particulière à utiliser) .
Matt
La localisation semble prometteuse, choisissez n'importe quel paramètre régional d'Europe centrale pour le format de point. Cependant, je ne l'ai pas testé et le format datetime complet n'est pas dans les exemples que j'ai vus.
Pavel V.
Je n'ai pas déçu, mais je voulais juste dire que c'est lent. Pour le bureau, ok, mais pour le mobile peut être trop lent (selon vos besoins).
gabn88
11

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

Datejs est une bibliothèque de date JavaScript open source pour l'analyse, le formatage et le traitement.

Alexis Abril
la source
Annulé cette modification, bien que très utile, elle devrait être ajoutée en tant que commentaire ou réponse distincte.
Alexis Abril
De toute façon, c'était trop long pour un commentaire, et ajouter une réponse en double est faux. Cette question a plus de 155 000 vues - donnons à ces personnes autant d'informations que possible! (au fait - il est très courant dans Stack Overflow de modifier une réponse existante - vous vous sentiriez probablement pire si je copiais simplement votre réponse ...)
Kobi
1
Et de toute façon, si vous n'aimez pas ma modification, c'est bien, mais veuillez développer votre réponse - "Juste pour une réponse mise à jour ici" est un remplissage, et il manque quelques détails. Soit dit en passant, cette question retient actuellement l' attention , c'est pourquoi vous avez soudainement obtenu 5 voix.
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
la source
5

La bibliothèque externe est une exagération pour analyser une ou deux dates, j'ai donc fait ma propre fonction en utilisant les solutions d' Oli et de Christoph . Ici, en Europe centrale, nous utilisons rarement autre chose que le format OP, donc cela devrait 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]));
    }
}
Pavel V.
la source
4

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

Si ce n'est pas le cas, vous devrez trouver quelque chose pour combler les deux. Votre exemple est assez simple (étant purement numérique), donc une touche de REGEX (ou même string.split()- peut-être plus rapide) associée à certains parseInt()vous permettra de faire rapidement une date.

Oli
la source
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
la source
plus 1 après avoir appelé la fonction getmonth () semble incorrect
Arjunsingh
t.getMonth () + 1 est correct car Date.getMonth () renvoie une valeur basée sur 0.
Jussi Palo
3

Juste pour donner mes 5 cents.

Mon format de date est jj.mm.aaaa (format UK) et aucun des exemples ci-dessus ne fonctionnait pour moi. Tous les analyseurs considéraient mm comme jour et dd 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 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 cela aide quelqu'un.

Anton Valqk
la source
Liens maintenant morts!
Eh bien ... une archive.org rapide a montré: bitbucket.org/mazzarelli/js-date/downloads est l'url du projet.
Anton Valqk
1

Moment.js gérera ceci:

var momentDate = moment('23.11.2009 12:34:56', 'DD.MM.YYYY HH:mm:ss');
var date = momentDate.;
Chintsu
la source
1
Bien que moment.js soit génial, il existe une pléthore de cas d'utilisation où vous devez simplement utiliser Javascript natif. Mon cas d'utilisation actuel est une fonction Carte dans CouchDB
Zach Smith
1

Vous pouvez utiliser la bibliothèque moment.js pour cela. J'utilise uniquement pour obtenir une sortie spécifique au temps, mais vous pouvez sélectionner le type de format que vous souhaitez sélectionner.

Référence:

1. bibliothèque moment: https://momentjs.com/

2. fonctions spécifiques à l'heure et à la date: https://timestamp.online/article/how-to-convert-timestamp-to-datetime-in-javascript

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

et vous pouvez appeler cette méthode comme:

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

J'espère que ça aide. Profitez du codage.

amit pandya
la source
0

Pour satisfaire pleinement la chaîne de conversion Date.parse au format jj-mm-AAAA comme spécifié dans la RFC822, si vous utilisez l'analyse aaaa-mm-jj, une erreur peut se produire.

Valentin Rusk
la source
Pour info, de la RFC 822 (page: 25. Partiellement nettoyé pour répondre à la longueur du texte pour le commentaire): 13 août 1982 - 25 - RFC # 822 5. DATE ET HEURE SPÉCIFICATION 5.1. SYNTAX date-heure = [jour ","] date-heure; jj mm aa hh: mm: ss zzz jour = "Lun" / "Mar" / "Mer" / "Jeu" / "Ven" / "Sam" / "Dim" date = 1 * 2DIGIT mois 2DIGIT; jour mois année par exemple 20 juin 82 mois = "Jan" / "Feb" / "Mar" / "Apr" / "Mai" / "Jun" / "Jul" / "Aug" / "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
la source
Le demandeur a demandé de spécifier une chaîne de format .
Armali
@Armali Paramètre d'entrée comme "/ Date (1552415400000) /" au format chaîne
Abhishek Kanrar