826 votes

Convertir une chaîne en date en JavaScript

Comment convertir une chaîne en date en JavaScript ?

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

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

3 votes

2 votes

Oh, je suis confus maintenant. Voulez-vous Date -> String o String -> Date ?

13 votes

Envisager momentjs.com

971voto

Pavel Hodek Points 2488

Le meilleur format de chaîne pour l'analyse syntaxique des chaînes est le format ISO de la date, associé au constructeur d'objets Date de JavaScript.

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

Mais attendez ! L'utilisation du "format ISO" n'est pas fiable en soi. Les chaînes sont parfois interprété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 d'effectuer les calculs en UTC.

Pour analyser une date en UTC, ajoutez un élément 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 y cette réponse .

Pour assurer la compatibilité avec l'ancien Internet Explorer (les versions d'IE inférieures à 9 ne prennent pas en charge le format ISO dans le constructeur de date), vous devez diviser la représentation de la chaîne de temps en ses parties, puis vous pouvez utiliser le constructeur en utilisant les parties de temps, par exemple : new Date('2011', '04' - 1, '11', '11', '51', '00') . Notez que le numéro du mois doit être inférieur de 1.


Méthode alternative - utiliser 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é.

0 votes

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é. new Date('2011-04-11 11:51:00') renvoie "invalid date".

2 votes

@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.

0 votes

Malheureusement, je me suis heurté au problème suivant *cela ne fonctionne pas pour TOUS les utilisateurs .

369voto

Roman Podlinov Points 1294

Malheureusement, j'ai découvert que

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

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

El une solution à toute épreuve est le suivant :

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

64 votes

Ce n'est pas fou du tout, l'ajustement est très probablement causé par DST à l'intérieur. Les dates au format yyyy-MM-dd sont interprétés comme des UTC et toString renvoie le local Par conséquent, selon le fuseau horaire de l'utilisateur, le résultat peut être différent. Si vous voulez toujours avoir l'heure en UTC, vous devez utiliser toUTCString .

0 votes

Je me suis tapé la tête sur ce sujet. Cela semble fonctionner, mais je ne comprends pas pourquoi vous avez utilisé parts[0]-1 et pas seulement parts[0].

4 votes

@AdamYoungers En raison de Javascript, les mois sont comptés à partir de 0 : janvier - 0, février - 1, etc.

149voto

serega386 Points 191
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}

7 votes

Malheureusement, il y a un problème avec cette solution. Plus de détails ici : stackoverflow.com/questions/17959660/

0 votes

La sortie est inconnue, car votre code ne convertit rien en chaîne de caractères et ne produit rien.

0 votes

Cela reviendra en fait le vendredi 25 avril

89voto

Kassem Points 21
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","-")

3 votes

Traite les dates de toutes les variantes, et pas seulement le formatage américain.

4 votes

@MarkJones Ne faites pas confiance aux .indexOf() car elle n'est pas compatible avec les navigateurs sans polyfils. Utilisez plutôt la méthode plus compatible .match() o .test() méthodes JS vanille.

1 votes

Ajout de var _delimiter = _format.match(/\W/g)[0]; au début de la fonction, vous pouvez obtenir le délimiteur automatiquement et le prescind du 3ème paramètre.

19voto

noiv Points 1933

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

Vous voyez que 0 pour le mois vous donne janvier

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X