web-dev-qa-db-fra.com

Conversion d'une chaîne en date en JavaScript

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

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

var dt_st= //st in date format same as dt
484
jslearner

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

Exemples de format ISO: YYYY-MM-DD ou YYYY-MM-DDTHH:MM:SS.

Mais attendez! L'utilisation du "format ISO" ne fonctionne pas de manière fiable. Les chaînes sont parfois analysées au format UTC et parfois au format local (en fonction du fournisseur et de la version du navigateur). La meilleure pratique devrait toujours être de stocker les dates au format UTC et d’effectuer les calculs au format UTC.

Pour analyser une date au format 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 à l'heure locale de l'utilisateur, utilisez .toString().

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

Pour une compatibilité ancienne avec Internet Explorer (les versions IE inférieures à 9 ne prennent pas en charge le format ISO dans le constructeur Date), vous devez scinder la représentation de chaîne datetime en plusieurs parties, puis utiliser un constructeur utilisant des pièces datetime, par exemple: new Date('2011', '04' - 1, '11', '11', '51', '00'). Notez que le nombre du mois doit être 1 moins.


Méthode alternative - utilisez une bibliothèque appropriée:

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

636
Pavel Hodek

Malheureusement, j'ai découvert que 

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

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

La solution bulletproof 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());

200
Roman Podlinov
var st = "26.04.2013";
var pattern = /(\d{2})\.(\d{2})\.(\d{4})/;
var dt = new Date(st.replace(pattern,'$3-$2-$1'));

Et le résultat sera:

dt => Date {Fri Apr 26 2013}
103
serega386
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","-")
70
Kassem

Passez le comme argument à Date ():

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

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

28
oblig

moment.js ( http://momentjs.com/ ) est un package complet et performant pour les dates et supports d’utilisation 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

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

Recommandation: Je recommande d'utiliser un paquet pour les dates qui contient beaucoup de formats, car la gestion du fuseau horaire et du format est vraiment un gros problème, js résolve beaucoup de formats. Vous pouvez facilement analyser une date depuis une simple chaîne à la fois, mais j'estime qu'il est difficile de prendre en charge tous les formats et variations de dates.

18
Juan Caicedo

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

Voir que 0 pour le mois vous donne Janvier

17
Torsten Becker

Si vous pouvez utiliser la formidable bibliothèque moment (par exemple dans un projet Node.js), vous pouvez facilement analyser votre date à l'aide.

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

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

momentDate ().toDate();
17
H6.

Les horodatages doivent être convertis 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
11
Lucky Soni

Pour ceux qui recherchent une solution petite 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");
11
Arivan Bastos

Si vous voulez convertir 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.

10
Alex N.

Date.parse vous donne presque ce que vous voulez. Cela étouffe la partie am/pm, mais avec quelques piratages, 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;
}
9
niksvp

check out datejs library http://www.datejs.com/

6
z33m

Juste new Date(st);

En supposant que c'est le bon format.

6
Mark Kahn

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 !!!

4
Marcelo Rebouças

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 retournera un objet Date . https://jsfiddle.net/Sushil231088/q56yd0rp/

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

Pour convertir une chaîne en date 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
3
Alexey Popov

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());
2
Andy

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
2
Mackraken

Si vous devez vérifier le contenu de la chaîne avant la conversion 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; 
}
1
Adriano P

var a = "13:15"
var b = toDate(a, "h:m")
alert(b);

function toDate(dStr, format) {
  var now = new Date();
  if (format == "h:m") {
    now.setHours(dStr.substr(0, dStr.indexOf(":")));
    now.setMinutes(dStr.substr(dStr.indexOf(":") + 1));
    now.setSeconds(0);
    return now;
  } else
    return "Invalid Format";
}

1
Kurenai Kunai

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

1
Syed
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 est donc préférable d'utiliser "/" au lieu de "-" dans la chaîne de format de date.

1
Ravi

J'ai écrit une fonction réutilisable que j'utilise lorsque je reçois des chaînes de date du serveur.
vous pouvez transmettre le délimiteur souhaité (/ - etc ..) qui sépare le jour, le mois et l’année afin d’utiliser la méthode split().
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>
1
jonathana

Vous pouvez utiliser regex pour analyser une chaîne afin de détailler l'heure, puis créer une date ou tout 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));
0
TungHarry

Une autre méthode 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
0
jo_va

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

}

0
Fetra
                //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);
0
Pec1983

Les bases de données ISO 8601, aussi excellentes soient-elles, ne sont toujours pas largement prises en charge. 

C'est une excellente ressource pour déterminer le format de chaîne de données à utiliser: 

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

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

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

0
taveras