Conversion d'une chaîne en une date en JavaScript

669

Comment puis-je convertir une chaîne en une date en JavaScript?

var st = "date in some format"
var dt = new date();

var dt_st= //st in date format same as dt
jslearner
la source
3
duplication possible de la conversion de données Java en date javascript et bien plus encore
Felix Kling
1
Oh, je suis confus maintenant. Voulez-vous Date -> Stringou String -> Date?
Felix Kling
10
considérez momentjs.com
hanshenrik

Réponses:

828

Le meilleur format de chaîne pour l'analyse de chaîne est le format ISO de date avec le constructeur d'objet JavaScript Date.

Exemples de format ISO: YYYY-MM-DDou YYYY-MM-DDTHH:MM:SS.

Mais attendez! Le simple fait d'utiliser le "format ISO" ne fonctionne pas de manière fiable en soi. Les chaînes sont parfois analysées en UTC et parfois en heure locale (en fonction du fournisseur et de la version du navigateur). La meilleure pratique devrait toujours être de stocker les dates en UTC et de faire des calculs en UTC.

Pour analyser une date en UTC, ajoutez un Z - par exemple:new Date('2011-04-11T10:20:30Z') .

Pour afficher une date en UTC, utilisez .toUTCString(),
pour afficher une date dans l'heure locale de l'utilisateur, utilisez.toString() .

Plus d'informations sur MDN | Date et cette réponse .

Pour la compatibilité ancienne Internet Explorer (IE versions moins de 9 ne prennent pas en charge le format ISO dans le constructeur Date), vous devez diviser datetime représentation de chaîne à des parties de et ensuite vous pouvez utiliser constructeur en utilisant datetime pièces, par exemple: new Date('2011', '04' - 1, '11', '11', '51', '00'). Notez que le numéro du mois doit être inférieur de 1.


Autre méthode - utilisez une bibliothèque appropriée:

Vous pouvez également profiter de la bibliothèque Moment.js qui permet d'analyser la date avec le fuseau horaire spécifié.

Pavel Hodek
la source
J'ai également dû utiliser la méthode "split the string" pour safari pour le même problème "Nan" que Paul Tomblin a soulevé. la nouvelle date ('2011-04-11 11:51:00') retournerait 'date invalide'.
Amos
1
@Amos: remarquez la lettre T, qui sépare la date et l'heure. Si vous écrivez, new Date('2011-04-11T11:51:00')la date de création est valide.
Pavel Hodek
Malheureusement, je suis tombé sur le problème selon lequel * cela ne fonctionne pas pour TOUS les utilisateurs .
Roman Podlinov du
3
Laisser Date analyser une chaîne est la pire façon de créer un objet Date. Il vaut bien mieux analyser la chaîne manuellement et appeler Date en tant que constructeur. Certains navigateurs traiteront une chaîne ISO sans fuseau horaire comme UTC, d'autres comme locale.
RobG
6
@Ben Taliadoros: Oui, ce n'est pas valable dans tous les navigateurs courants, new Date('1970-30-02')c'est une date invalide car il n'y a pas 30 mois dans une année. Vous ne pouvez pas déborder de mois, mais lorsque vous débordez de jours, il se résout dans Chrome et Firefox à une date valide: new Date('1970-02-30')est alors le même jour que la nouvelle date ('1970-03-02').
Pavel Hodek du
291

Malheureusement, j'ai découvert que

var mydate = new Date('2014-04-03');
console.log(mydate.toDateString());

renvoie "Wed Apr 02 2014". Je sais que cela semble fou, mais cela arrive pour certains utilisateurs.

La solution pare-balles est la suivante:

var parts ='2014-04-03'.split('-');
// Please pay attention to the month (parts[1]); JavaScript counts months from 0:
// January - 0, February - 1, etc.
var mydate = new Date(parts[0], parts[1] - 1, parts[2]); 
console.log(mydate.toDateString());

Roman Podlinov
la source
45
Ce n'est pas fou du tout, l'ajustement est probablement causé par le passage à l' heure d' été . Les dates au format yyyy-MM-ddsont analysées en UTC et toString renvoie l' heure locale , donc en fonction du fuseau horaire des utilisateurs, il peut très certainement retourner des résultats différents. Si vous voulez toujours l'heure en UTC, vous devez utiliser toUTCString .
James
Je me suis cogné la tête sur celui-ci. Cela semble fonctionner, mais je ne comprends pas pourquoi vous avez utilisé les parties [0] -1 et pas seulement les parties [0].
Adam Youngers
4
@AdamYoungers En raison de Javascript compte des mois à partir de 0: janvier - 0, février - 1, etc.
Roman Podlinov
1
Cette réponse suggère que le comportement dans l'exemple est incorrect. Selon la spécification: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… (voir: datestring) la valeur sortie dans l'exemple serait correcte
James Ross
124
var st = "26.04.2013";
var pattern = /(\d{2})\.(\d{2})\.(\d{4})/;
var dt = new Date(st.replace(pattern,'$3-$2-$1'));

Et la sortie sera:

dt => Date {Fri Apr 26 2013}
serega386
la source
5
Malheureusement, il y a un problème avec cette solution. Détails ici: stackoverflow.com/questions/17959660/…
Roman Podlinov
La sortie est inconnue, car votre code ne convertit rien en chaîne ni ne produit quoi que ce soit.
Robert Siemer
81
function stringToDate(_date,_format,_delimiter)
{
            var formatLowerCase=_format.toLowerCase();
            var formatItems=formatLowerCase.split(_delimiter);
            var dateItems=_date.split(_delimiter);
            var monthIndex=formatItems.indexOf("mm");
            var dayIndex=formatItems.indexOf("dd");
            var yearIndex=formatItems.indexOf("yyyy");
            var month=parseInt(dateItems[monthIndex]);
            month-=1;
            var formatedDate = new Date(dateItems[yearIndex],month,dateItems[dayIndex]);
            return formatedDate;
}

stringToDate("17/9/2014","dd/MM/yyyy","/");
stringToDate("9/17/2014","mm/dd/yyyy","/")
stringToDate("9-17-2014","mm-dd-yyyy","-")
Kassem
la source
3
Gère les dates de chaque variation, pas seulement le formatage américain
Mark Jones
4
@MarkJones Ne faites pas confiance à la .indexOf()méthode car elle n'est pas compatible avec plusieurs navigateurs sans fichiers polyfils. À la place, utilisez les méthodes JS plus compatibles .match()ou .test()vanilla.
Alexander Dixon
1
En ajoutant var _delimiter = _format.match(/\W/g)[0];au début de la fonction, vous pouvez obtenir le délimiteur automatiquement et pré-découper le 3ème paramètre.
campsjos
39

moment.js ( http://momentjs.com/ ) est un package complet et efficace pour les dates d'utilisation et prend en charge les chaînes ISO 8601 .

Vous pouvez ajouter une date et un format de chaîne.

moment("12-25-1995", "MM-DD-YYYY");

Et vous pouvez vérifier si une date est valide.

moment("not a real date").isValid(); //Returns false

Quelques exemples d'affichage

let dt = moment("02-01-2019", "MM-DD-YYYY");
console.log(dt.fromNow()+' |'+dt.format('LL')) 
// output: "3 months ago | February 1, 2019"

Voir la documentation http://momentjs.com/docs/#/parsing/string-format/

Recommandation: je recommande d'utiliser un package pour les dates qui contient beaucoup de formats car le fuseau horaire et la gestion du temps de format sont vraiment un gros problème, moment js résout beaucoup de formats. Vous pouvez facilement analyser la date à partir d'une simple chaîne à ce jour, mais je pense que c'est un travail difficile pour prendre en charge tous les formats et variations de dates.

Juan Caicedo
la source
1
Quelques exemples d'affichage de let dt = moment("02-01-2019", "MM-DD-YYYY");console.log(dt.fromNow()+' | '+dt.format('LL')) sorties: "il y a 3 mois | 1er février 2019"
CPHPython
36

Passez-le comme argument à Date ():

var st = "date in some format"
var dt = new Date(st);

Vous pouvez accéder à la date, le mois, l' année en utilisant, par exemple: dt.getMonth().

obliger
la source
8
je fais console.log(new Date('30-08-2018'))et reçois une date invalide
Dwigh
Cette réponse ignore les complexités multiples de ce problème, par exemple, si je fais cela pour une date 01/02/2020sur mon ordinateur (au Royaume-Uni), il retournera le 1er février où, comme si la même chose se faisait aux États-Unis, il retournera le 2 janvier. Vous ne devriez pratiquement jamais utiliser cette implémentation naïve. Utilisez plutôt le moment .
Liam
23

Si vous pouvez utiliser la bibliothèque de moments formidables (par exemple dans un projet Node.js), vous pouvez facilement analyser votre date en utilisant par exemple

var momentDate = moment("2014-09-15 09:00:00");

et peut accéder à l'objet de date JS via

momentDate ().toDate();
H6.
la source
5
veuillez noter que le moment fonctionne très bien sans nœud
shaheer
J'ai eu une erreur NaN dans mes appareils Android et IOS lors de l'utilisation de ce code, mais cela fonctionnait sur le bureau. voici le code que j'utilisais auparavant: var dateTimeOfTimeIn = new Date (année + "-" + mois + "-" + jour + "T" + data.timeIn); en utilisant cette bibliothèque d'approche et de moment, mon problème a été résolu et mon code fonctionne désormais correctement sur tous mes appareils!
Mehdi
20

new Date(2000, 10, 1) vous donnera "Mer 01 nov 2000 00:00:00 GMT + 0100 (CET)"

Voir que 0 pour le mois vous donne janvier

Torsten Becker
la source
19

Pour ceux qui recherchent une solution minuscule et intelligente:

String.prototype.toDate = function(format)
{
  var normalized      = this.replace(/[^a-zA-Z0-9]/g, '-');
  var normalizedFormat= format.toLowerCase().replace(/[^a-zA-Z0-9]/g, '-');
  var formatItems     = normalizedFormat.split('-');
  var dateItems       = normalized.split('-');

  var monthIndex  = formatItems.indexOf("mm");
  var dayIndex    = formatItems.indexOf("dd");
  var yearIndex   = formatItems.indexOf("yyyy");
  var hourIndex     = formatItems.indexOf("hh");
  var minutesIndex  = formatItems.indexOf("ii");
  var secondsIndex  = formatItems.indexOf("ss");

  var today = new Date();

  var year  = yearIndex>-1  ? dateItems[yearIndex]    : today.getFullYear();
  var month = monthIndex>-1 ? dateItems[monthIndex]-1 : today.getMonth()-1;
  var day   = dayIndex>-1   ? dateItems[dayIndex]     : today.getDate();

  var hour    = hourIndex>-1      ? dateItems[hourIndex]    : today.getHours();
  var minute  = minutesIndex>-1   ? dateItems[minutesIndex] : today.getMinutes();
  var second  = secondsIndex>-1   ? dateItems[secondsIndex] : today.getSeconds();

  return new Date(year,month,day,hour,minute,second);
};

Exemple:

"22/03/2016 14:03:01".toDate("dd/mm/yyyy hh:ii:ss");
"2016-03-29 18:30:00".toDate("yyyy-mm-dd hh:ii:ss");
Arivan Bastos
la source
Fonctionne comme un charme! Tu m'as sauvé la vie mec!
Steve Nosse du
16

Juste new Date(st);

En supposant que c'est le bon format .

Mark Kahn
la source
Solution la meilleure et la plus simple
Ahmed Ghrib
12

Si vous souhaitez convertir à partir du format "jj / MM / aaaa". Voici un exemple:

var pattern = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
var arrayDate = stringDate.match(pattern);
var dt = new Date(arrayDate[3], arrayDate[2] - 1, arrayDate[1]);

Cette solution fonctionne dans les versions IE inférieures à 9.

Alexandre N.
la source
12

Les horodatages doivent être castés en un nombre

var ts = '1471793029764';
ts = Number(ts); // cast it to a Number
var date = new Date(ts); // works

var invalidDate = new Date('1471793029764'); // does not work. Invalid Date
Lucky Soni
la source
1
Et la undefinedvaleur? Comme var date = new Date(undefined):?
Benny Neugebauer
@BennyNeugebauer vérifie bien si une valeur n'est pas définie avant d'essayer de la transmettre au constructeur Date. Peut-être que vous souhaitez lever une exception ou peut-être que vous souhaitez revenir à une date par défaut, qui sait?
Lucky Soni
9

Date.parsevous obtient presque ce que vous voulez. Il s'étouffe sur la partie am/ pm, mais avec un certain piratage, vous pouvez le faire fonctionner:

var str = 'Sun Apr 25, 2010 3:30pm',
    timestamp;

timestamp = Date.parse(str.replace(/[ap]m$/i, ''));

if(str.match(/pm$/i) >= 0) {
    timestamp += 12 * 60 * 60 * 1000;
}
niksvp
la source
6

Convertir au format pt-BR:

    var dateString = "13/10/2014";
    var dataSplit = dateString.split('/');
    var dateConverted;

    if (dataSplit[2].split(" ").length > 1) {

        var hora = dataSplit[2].split(" ")[1].split(':');
        dataSplit[2] = dataSplit[2].split(" ")[0];
        dateConverted = new Date(dataSplit[2], dataSplit[1]-1, dataSplit[0], hora[0], hora[1]);

    } else {
        dateConverted = new Date(dataSplit[2], dataSplit[1] - 1, dataSplit[0]);
    }

J'espère aider quelqu'un !!!

Marcelo Rebouças
la source
5

J'ai créé un violon pour cela, vous pouvez utiliser la fonction toDate () sur n'importe quelle chaîne de date et fournir le format de date. Cela vous renverra un objet Date. https://jsfiddle.net/Sushil231088/q56yd0rp/

"17/9/2014".toDate("dd/MM/yyyy", "/")
Sushil Mahajan
la source
4

Pour convertir une chaîne à ce jour en js, j'utilise http://momentjs.com/

moment().format('MMMM Do YYYY, h:mm:ss a'); // August 16th 2015, 4:17:24 pm
moment().format('dddd');                    // Sunday
moment().format("MMM Do YY");               // Aug 16th 15
moment().format('YYYY [escaped] YYYY');     // 2015 escaped 2015
moment("20111031", "YYYYMMDD").fromNow(); // 4 years ago
moment("20120620", "YYYYMMDD").fromNow(); // 3 years ago
moment().startOf('day').fromNow();        // 16 hours ago
moment().endOf('day').fromNow();          // in 8 hours
Alexey Popov
la source
1
moment () prend par défaut la date actuelle. Comment formater une chaîne au format "2016-06-27 17: 49: 51.951602 + 05: 30" en utilisant moment.
Zoran777
4

J'ai créé cette fonction pour convertir n'importe quel objet Date en objet Date UTC.

function dateToUTC(date) {
    return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
}


dateToUTC(new Date());
Andy
la source
3

Encore une autre façon de le faire:

String.prototype.toDate = function(format) {
    format = format || "dmy";
    var separator = this.match(/[^0-9]/)[0];
    var components = this.split(separator);
    var day, month, year;
    for (var key in format) {
        var fmt_value = format[key];
        var value = components[key];
        switch (fmt_value) {
            case "d":
                day = parseInt(value);
                break;
            case "m":
                month = parseInt(value)-1;
                break;
            case "y":
                year = parseInt(value);
        }
    }
    return new Date(year, month, day);
};
a = "3/2/2017";
console.log(a.toDate("dmy"));
// Date 2017-02-03T00:00:00.000Z
Mackraken
la source
Ah! Soigné! Enfin un code qui prend en charge le séparateur utilisé.
Sam Sirry
3

Vous pouvez essayer ceci:

function formatDate(userDOB) {
  const dob = new Date(userDOB);

  const monthNames = [
    'January', 'February', 'March', 'April', 'May', 'June', 'July',
     'August', 'September', 'October', 'November', 'December'
  ];

  const day = dob.getDate();
  const monthIndex = dob.getMonth();
  const year = dob.getFullYear();

  // return day + ' ' + monthNames[monthIndex] + ' ' + year;
  return `${day} ${monthNames[monthIndex]} ${year}`;
}

console.log(formatDate('1982-08-10'));

Syed
la source
2
var date = new Date(year, month, day);

ou

var date = new Date('01/01/1970');

la chaîne de date au format '01 -01-1970 'ne fonctionnera pas dans FireFox, il vaut donc mieux utiliser "/" au lieu de "-" dans la chaîne de format de date.

Ravi
la source
ma chaîne est "2015/08/03 13:06:16" strill en FF ça ne fonctionne pas
Dhara
2

Si vous devez vérifier le contenu de la chaîne avant de convertir au format Date:

// Convert 'M/D/YY' to Date()
mdyToDate = function(mdy) {
  var d = mdy.split(/[\/\-\.]/, 3);

  if (d.length != 3) return null;

  // Check if date is valid
  var mon = parseInt(d[0]), 
      day = parseInt(d[1]),
      year= parseInt(d[2]);
  if (d[2].length == 2) year += 2000;
  if (day <= 31 && mon <= 12 && year >= 2015)
    return new Date(year, mon - 1, day);

  return null; 
}
Adriano P
la source
2

J'ai créé la fonction parseDateTime pour convertir la chaîne en objet date et cela fonctionne dans tous les navigateurs (y compris le navigateur IE), vérifiez si quelqu'un est nécessaire, référence https://github.com/Umesh-Markande/Parse-String-to-Date -en-tout-navigateur

    function parseDateTime(datetime) {
            var monthNames = [
                "January", "February", "March",
                "April", "May", "June", "July",
                "August", "September", "October",
                "November", "December"
              ];
            if(datetime.split(' ').length == 3){
                var date = datetime.split(' ')[0];
                var time = datetime.split(' ')[1].replace('.00','');
                var timearray = time.split(':');
                var hours = parseInt(time.split(':')[0]);
                var format = datetime.split(' ')[2];
                var bits = date.split(/\D/);
                date = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
                var day = date.getDate();
                var monthIndex = date.getMonth();
                var year = date.getFullYear();
                if ((format === 'PM' || format === 'pm') && hours !== 12) {
                    hours += 12;
                    try{  time = hours+':'+timearray[1]+':'+timearray[2] }catch(e){ time = hours+':'+timearray[1] }
                } 
                var formateddatetime = new Date(monthNames[monthIndex] + ' ' + day + '  ' + year + ' ' + time);
                return formateddatetime;
            }else if(datetime.split(' ').length == 2){
                var date = datetime.split(' ')[0];
                var time = datetime.split(' ')[1];
                var bits = date.split(/\D/);
                var datetimevalue = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
                var day = datetimevalue.getDate();
                var monthIndex = datetimevalue.getMonth();
                var year = datetimevalue.getFullYear();
                var formateddatetime = new Date(monthNames[monthIndex] + ' ' + day + '  ' + year + ' ' + time);
                return formateddatetime;
            }else if(datetime != ''){
                var bits = datetime.split(/\D/);
                var date = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
                return date;
            }
            return datetime;
        }

    var date1 = '2018-05-14 05:04:22 AM';   // yyyy-mm-dd hh:mm:ss A
    var date2 = '2018/05/14 05:04:22 AM';   // yyyy/mm/dd hh:mm:ss A
    var date3 = '2018/05/04';   // yyyy/mm/dd
    var date4 = '2018-05-04';   // yyyy-mm-dd
    var date5 = '2018-05-14 15:04:22';   // yyyy-mm-dd HH:mm:ss
    var date6 = '2018/05/14 14:04:22';   // yyyy/mm/dd HH:mm:ss

    console.log(parseDateTime(date1))
    console.log(parseDateTime(date2))
    console.log(parseDateTime(date3))
    console.log(parseDateTime(date4))
    console.log(parseDateTime(date5))
    console.log(parseDateTime(date6))

**Output---**
Mon May 14 2018 05:04:22 GMT+0530 (India Standard Time)
Mon May 14 2018 05:04:22 GMT+0530 (India Standard Time)
Fri May 04 2018 00:00:00 GMT+0530 (India Standard Time)
Fri May 04 2018 00:00:00 GMT+0530 (India Standard Time)
Mon May 14 2018 15:04:22 GMT+0530 (India Standard Time)
Mon May 14 2018 14:04:22 GMT+0530 (India Standard Time)
Umesh Markande
la source
Celui-ci a fonctionné pour moi. Je vous remercie.
Christopher D. Emerson
2

Cette réponse est basée sur la réponse de Kassem mais elle traite également les années à deux chiffres. J'ai soumis une modification à la réponse de Kassem, mais au cas où elle ne serait pas approuvée, je la soumets également en tant que réponse distincte.

function stringToDate(_date,_format,_delimiter) {
        var formatLowerCase=_format.toLowerCase();
        var formatItems=formatLowerCase.split(_delimiter);
        var dateItems=_date.split(_delimiter);
        var monthIndex=formatItems.indexOf("mm");
        var dayIndex=formatItems.indexOf("dd");
        var yearIndex=formatItems.indexOf("yyyy");
        var year = parseInt(dateItems[yearIndex]); 
        // adjust for 2 digit year
        if (year < 100) { year += 2000; }
        var month=parseInt(dateItems[monthIndex]);
        month-=1;
        var formatedDate = new Date(year,month,dateItems[dayIndex]);
        return formatedDate;
}

stringToDate("17/9/14","dd/MM/yyyy","/");
stringToDate("17/9/2014","dd/MM/yyyy","/");
stringToDate("9/17/2014","mm/dd/yyyy","/")
stringToDate("9-17-2014","mm-dd-yyyy","-")
Daniel Patru
la source
1

Vous pouvez utiliser regex pour analyser la chaîne pour détailler l'heure, puis créer une date ou tout autre format de retour comme:

//example : let dateString = "2018-08-17 01:02:03.4"

function strToDate(dateString){
    let reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}).(\d{1})/
  , [,year, month, day, hours, minutes, seconds, miliseconds] = reggie.exec(dateString)
  , dateObject = new Date(year, month-1, day, hours, minutes, seconds, miliseconds);
  return dateObject;
}
alert(strToDate(dateString));
TungHarry
la source
1

Performance

Aujourd'hui (2020.05.08), j'effectue des tests pour les solutions choisies - pour deux cas: la date d'entrée est une chaîne ISO8601 (Ad, Bd, Cd, Dd, Ed) et la date d'entrée est un horodatage (At, Ct, Dt). Les solutions Bd, Cd, Ct ne renvoient pas d'objet js Date comme résultats, mais je les ajoute car elles peuvent être utiles mais je ne les compare pas avec des solutions valides. Ces résultats peuvent être utiles pour une analyse de date massive.

Conclusions

  • Solution new Date (Ad) est 50 à 100 fois plus rapide que moment.js (Dd) pour tous les navigateurs pour la date et l'horodatage ISO
  • La solution new Date(Ad) est environ 10 fois plus rapide queparseDate (Ed)
  • La solution Date.parse(Bd) est la plus rapide si nous devons obtenir l'horodatage de la date ISO sur tous les navigateurs

entrez la description de l'image ici

Détails

J'effectue un test sur MacOs High Sierra 10.13.6 sur Chrome 81.0, Safari 13.1, Firefox 75.0. La solution parseDate(Ed) utilise new Date(0)et définit manuellement les composants de date UTC.

Résultats pour chrome

entrez la description de l'image ici

Kamil Kiełczewski
la source
0

Les chaînes de données ISO 8601, aussi excellentes que la norme, ne sont toujours pas largement prises en charge.

Ceci est une excellente ressource pour déterminer le format de chaîne de données que vous devez utiliser:

http://dygraphs.com/date-formats.html

Oui, cela signifie que votre chaîne de données peut être aussi simple que par opposition à

"2014/10/13 23:57:52" au lieu de "2014-10-13 23:57:52"

taveras
la source
0
                //little bit of code for Converting dates 

                var dat1 = document.getElementById('inputDate').value;
                var date1 = new Date(dat1)//converts string to date object
                alert(date1);
                var dat2 = document.getElementById('inputFinishDate').value;
                var date2 = new Date(dat2)
                alert(date2);
Pec1983
la source
0

utilisez ce code: (mon problème a été résolu avec ce code)

function dateDiff(date1, date2){
var diff = {}                           // Initialisation du retour
var tmp = date2 - date1;

tmp = Math.floor(tmp/1000);             // Nombre de secondes entre les 2 dates
diff.sec = tmp % 60;                    // Extraction du nombre de secondes

tmp = Math.floor((tmp-diff.sec)/60);    // Nombre de minutes (partie entière)
diff.min = tmp % 60;                    // Extraction du nombre de minutes

tmp = Math.floor((tmp-diff.min)/60);    // Nombre d'heures (entières)
diff.hour = tmp % 24;                   // Extraction du nombre d'heures

tmp = Math.floor((tmp-diff.hour)/24);   // Nombre de jours restants
diff.day = tmp;

return diff;

}

Fetra
la source
3
veuillez expliquer votre réponse
Mazz
Les paramètres date1 et date2 doivent avoir le format comme date à droite.
Fetra
la date de retour de la fonction nommée diff. Si vous voulez que le nombre de jours retournés soit comme ça: var result = dateDiff (date1, date2); var numéro_jour = result.day; c'est facile
Fetra
0

J'ai écrit une fonction réutilisable que j'utilise lorsque j'obtiens des chaînes de date du serveur.
vous pouvez passer le délimiteur souhaité (/ - etc.) qui sépare le jour mois et année afin d'utiliser la split()méthode.
vous pouvez le voir et le tester sur cet exemple de travail .

<!DOCTYPE html>
<html>
  <head>
    <style>
    </style>
  </head>
  <body>
    <div>
      <span>day:
      </span> 
      <span id='day'>
      </span>
    </div>
    <div>
      <span>month:
      </span> 
      <span id='month'>
      </span>
    </div>
    <div>
      <span>year:
      </span> 
      <span id='year'>
      </span>
    </div>
    <br/>
    <input type="button" id="" value="convert" onClick="convert('/','28/10/1980')"/>
    <span>28/10/1980
    </span>
    <script>
      function convert(delimiter,dateString)
      {
        var splitted = dateString.split('/');
        // create a new date from the splitted string 
        var myDate = new Date(splitted[2],splitted[1],splitted[0]);
        // now you can access the Date and use its methods 
        document.getElementById('day').innerHTML = myDate.getDate();
        document.getElementById('month').innerHTML = myDate.getMonth();
        document.getElementById('year').innerHTML = myDate.getFullYear();
      }
    </script>
  </body>
</html>
jonathana
la source
0

Une autre façon de le faire consiste à créer une expression régulière avec des groupes de capture nommés sur la chaîne de format, puis à utiliser cette expression régulière pour extraire le jour, le mois et l'année de la chaîne de date:

function parseDate(dateStr, format) {
  const regex = format.toLocaleLowerCase()
    .replace(/\bd+\b/, '(?<day>\\d+)')
    .replace(/\bm+\b/, '(?<month>\\d+)')
    .replace(/\by+\b/, '(?<year>\\d+)')
  
  const parts = new RegExp(regex).exec(dateStr) || {};
  const { year, month, day } = parts.groups || {};
  return parts.length === 4 ? new Date(year, month-1, day) : undefined;
}

const printDate = x => console.log(x ? x.toLocaleDateString() : x);

printDate(parseDate('05/11/1896', 'dd/mm/YYYY'));
printDate(parseDate('07-12-2000', 'dd-mm-yy'));
printDate(parseDate('07:12:2000', 'dd:mm:yy'));
printDate(parseDate('2017/6/3', 'yy/MM/dd'));
printDate(parseDate('2017-6-15', 'y-m-d'));
printDate(parseDate('2015 6 25', 'y m d'));
printDate(parseDate('2015625', 'y m d')); // bad format

jo_va
la source
belle solution, mais vous ne savez peut-être pas que Firefox ne prend toujours pas en charge les groupes nommés RegExp - bugzilla.mozilla.org/show_bug.cgi?id=1362154 (PS: ce n'est pas moi qui a dévalorisé votre réponse)
qdev