204 votes

Convertir la chaîne dd-mm-yyyy en date

J'essaie de convertir une chaîne au format dd-mm-yyyy en un objet date en JavaScript en utilisant ce qui suit :

 var from = $("#datepicker").val();
 var to = $("#datepickertwo").val();
 var f = new Date(from);
 var t = new Date(to);

("#datepicker").val() contient une date au format dd-mm-yyyy. Lorsque je fais ce qui suit, j'obtiens "Invalid Date" :

alert(f);

Est-ce à cause du symbole '-' ? Comment puis-je surmonter ce problème ?

0 votes

Cela se produit-il avec toutes les dates ou une en particulier ?

349voto

Adrian Lynch Points 813

Diviser sur "-"

Analysez la chaîne de caractères en fonction des parties dont vous avez besoin :

var from = $("#datepicker").val().split("-")
var f = new Date(from[2], from[1] - 1, from[0])

Utiliser une expression rationnelle

var date = new Date("15-05-2018".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3"))

Pourquoi ne pas utiliser les regex ?

Parce que vous savez que vous allez travailler sur une chaîne composée de trois parties, séparées par des tirets.

Toutefois, si vous recherchez cette même chaîne dans une autre chaîne, les regex sont la solution.

Réutilisation

Parce que vous faites cela plus d'une fois dans votre code d'exemple, et peut-être ailleurs dans votre base de code, emballez-le dans une fonction :

function toDate(dateStr) {
  var parts = dateStr.split("-")
  return new Date(parts[2], parts[1] - 1, parts[0])
}

Utilisé comme :

var from = $("#datepicker").val()
var to = $("#datepickertwo").val()
var f = toDate(from)
var t = toDate(to)

Ou si ça ne vous dérange pas d'avoir du jQuery dans votre fonction :

function toDate(selector) {
  var from = $(selector).val().split("-")
  return new Date(from[2], from[1] - 1, from[0])
}

Utilisé comme :

var f = toDate("#datepicker")
var t = toDate("#datepickertwo")

JavaScript moderne

Si vous êtes en mesure d'utiliser un JS plus moderne, la déstructuration des tableaux est également une touche agréable :

const toDate = (dateStr) => {
  const [day, month, year] = dateStr.split("-")
  return new Date(year, month - 1, day)
}

10 votes

M'a devancé... mais j'utilise toujours DateJs. Ce n'est pas tout à fait correct en raison d'une erreur de poteau de clôture. le mois est 0-11 donc vous devez soustraire 1. f = nouvelle Date(from[2], from[1]-1, from[0]) ;

14 votes

Réponse sélectionnée avec un bug qui produit des dates erronées. Génial !

3 votes

Merci @kasdega - Je l'ai modifié... il y a un moment !

140voto

epascarello Points 71353

Exemple d'expression régulière :

new Date( "13-01-2011".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3") );

8 votes

Une révision qui prend aussi / est le délimiteur et une année composée de 2 chiffres (ou tout autre nombre supérieur à 1) : replace( /(\d{2})[-/](\d{2})[-/](\d+)/, "$2/$1/$3")

1 votes

Pourquoi cela devrait-il être la réponse choisie @AdemirNuno ? Pourquoi utiliser RegEx pour une chaîne de caractères dans un format connu ? Vous ne cherchez pas un modèle, vous savez que le premier chiffre est le jour, le deuxième le mois et le troisième l'année. RegEx n'est pas le bon outil pour ce travail dans ce cas.

0 votes

Une révision qui prend en compte les délimiteurs non numériques, les dates sans zéros en tête et les années à 2 ou 4 chiffres : new Date( "23. 2. 15".replace( /(\d+)[^d]+(\d+)[^d]+(\d+)/, "$2/$1/$3") ); fr.wikipedia.org/wiki/Date_format_by_country

16voto

Joe Points 34413

Une autre possibilité :

var from = "10-11-2011"; 
var numbers = from.match(/\d+/g); 
var date = new Date(numbers[2], numbers[0]-1, numbers[1]);

Faites correspondre les chiffres et réorganisez-les

0 votes

De plus, la question originale spécifiait "dd-mm-yyyy", et non "mm-dd-yyyy", donc c'est toujours faux (mais de justesse).

0 votes

@epascarello Comment convertir "Month dd, yyyy" en "MM/dd/yyyy" en javascript ?

1 votes

var date = new Date(numbers[2], numbers[1]-1, numbers[0]);

5voto

Diodeus Points 67946

Utilisez ce format : myDate = new Date('2011-01-03'); // Mon Jan 03 2011 00:00:00

1 votes

Où avez-vous eu ça ? parseDate fonction de ? Est-ce une fonction native de javascript ?

0 votes

Désolé, comment puis-je mettre cela en œuvre ? J'ai également besoin du format jj-mm-aa.

0 votes

ParseDate est une fonction native de JS. Pour plus d'informations, voir : xaprb.com/articles/javascript-date-parsing-demo.html

2voto

Wes Points 7117

Vous pouvez faire appel à une bibliothèque externe pour vous aider.

http://www.mattkruse.com/javascript/date/source.html

getDateFromFormat(val,format);

Voir aussi ceci : Analyse de la chaîne DateTime en JavaScript

0 votes

Comment convertir maDate = '20/06/17' en format '20/6/2017 00:00:00' en javascript ?

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