Convertir la chaîne jj-mm-aaaa en date

184

J'essaie de convertir une chaîne au format jj-mm-aaaa en un objet de 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 jj-mm-aaaa. Lorsque je fais ce qui suit, j'obtiens "Date invalide":

alert(f);

Est-ce à cause du symbole «-»? Comment puis-je surmonter cela?

user559142
la source
Cela se produit-il avec toutes les dates ou une en particulier?
kasdega

Réponses:

326

Fractionner sur "-"

Analysez la chaîne dans les parties dont vous avez besoin:

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

Utiliser regex

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

Pourquoi ne pas utiliser regex?

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

Cependant, si vous recherchiez cette même chaîne dans une autre chaîne, regex serait la voie à suivre.

Réutilisation

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

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

Utilisation comme:

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

Ou si jQuery ne vous dérange pas dans votre fonction:

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

Utilisation comme:

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

JavaScript moderne

Si vous pouvez utiliser un JS plus moderne, la déstructuration des tableaux est également une bonne idée:

const toDate = (dateStr) => {
  const [day, month, year] = dateStr.split("-")
  return new Date(year, month - 1, day)
}
Adrian Lynch
la source
9
me battre pour ça ... mais j'utilise toujours des 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 = new Date (de [2], de [1] -1, de [0]);
kasdega
12
Réponse sélectionnée avec un bug qui produit des dates erronées. Impressionnant!
epascarello
3
Cheers @kasdega - Je l'ai modifié ... il y a quelque temps!
Adrian Lynch
@AdrianLynch Comment convertir "Mois jj, aaaa" en "MM / jj / aaaa" en javascript?
dilipkumar1007
1
@Adrian Lynch L'option JavaScript moderne est géniale! Je vous remercie.
Alexandre Ribeiro
134

exemple d'expression régulière:

new Date( "13-01-2011".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3") );
epascarello
la source
8
Une révision qui prend également /est délimiteur et une année composée de 2 chiffres (ou tout nombre supérieur à 1):replace( /(\d{2})[-/](\d{2})[-/](\d+)/, "$2/$1/$3")
Izhaki
1
Pourquoi cette réponse devrait-elle être @AdemirNuno? Pourquoi utiliser RegEx pour une chaîne 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 est le mauvais outil pour le travail dans ce cas.
Adrian Lynch
Une révision qui prend des délimiteurs sans chiffres, des dates sans zéros non significatifs et des années à 2 ou 4 chiffres: new Date( "23. 2. 15".replace( /(\d+)[^d]+(\d+)[^d]+(\d+)/, "$2/$1/$3") ); en.wikipedia.org/wiki/Date_format_by_country
PaulH
c'est tellement pratique mec, merci. mon format de date vient avec l'heure, donc je le recode comme: 'new Date ("13-01-2011" .replace (/ (\ d {2}) - (\ d {2}) - (\ w) / , "$ 2 / $ 1 / $ 3")); ' est ce juste?
Kamuran Sönecek le
@NeerajSingh Comment convertir "Mois jj, aaaa" en "MM / jj / aaaa" en javascript?
dilipkumar1007
15

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

Joe
la source
La question d'origine spécifiait également "jj-mm-aaaa", pas "mm-jj-aaaa", donc c'est toujours faux (mais seulement juste).
Phil M Jones
@epascarello Comment convertir "Mois jj, aaaa" en "MM / jj / aaaa" en javascript?
dilipkumar1007
1
var date = new Date(numbers[2], numbers[1]-1, numbers[0]);
Rui Nunes
7

En utilisant l' exemple de moment.js :

var from = '11-04-2017' // OR $("#datepicker").val();
var milliseconds = moment(from, "DD-MM-YYYY").format('x');
var f = new Date(milliseconds)
Makah
la source
1
moment (du, "JJ-MM-AAAA"). auDate ()
Lapenkov Vladimir
6
var from = $("#datepicker").val(); 
var f = $.datepicker.parseDate("d-m-Y", from);
Saad Imran.
la source
3
Obtenez-vous Date.parseDate?
kasdega
@kasdega Désolé, je pensais à $ .datepicker.parseDate, je l'ai corrigé maintenant :)
Saad Imran.
Vous devriez utiliser $.datepicker.parseDate("dd-mm-yy", from);pour analyser correctement une date comme 24-01-2017, consultez la documentation de datepicker
Andrea Mauro
4

Vous pouvez également écrire une date entre les parenthèses de l' Date()objet, comme ceci:

new Date("Month dd, yyyy hh:mm:ss")
new Date("Month dd, yyyy")
new Date(yyyy,mm,dd,hh,mm,ss)
new Date(yyyy,mm,dd)
new Date(milliseconds)
Prisonnier ZERO
la source
@AmitSengar Comment convertir "Mois jj, aaaa" en "MM / jj / aaaa" en javascript?
dilipkumar1007
3

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

Diodeus - James MacFarlane
la source
1
D'où avez-vous obtenu cette parseDatefonction? Est-ce une fonction javascript native?
Joseph Silber
désolé comment puis-je mettre en œuvre cela? aussi j'ai besoin du format jj-mm-aa
user559142
parseDate est une fonction JS native. Pour plus d'informations, voir: xaprb.com/articles/javascript-date-parsing-demo.html
Diodeus - James MacFarlane
1
@Diodeus ... vraiment c'est natif? comment se fait-il que ff et chrome jettent des erreurs?
epascarello
2
@Diodeus même avec la dernière modification, cela ne fonctionne pas tout à fait pour moi (avec Chrome au moins). Il définit la date sur '2011-01-03'et l'heure UTC sur 00:00:00. Donc, si le fuseau horaire de l'utilisateur est inférieur à UTC, ce sera en fait la veille.
Mike
3

Dans mon cas

new Date("20151102034013".replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/, "$1-$2-$3T$4:$5:$6"))

Résultat: lun 02 novembre 2015 04:40:13 GMT + 0100 (CET) puis j'utilise .getTime () pour travailler avec des millisecondes

argene santoni
la source
3

La réponse acceptée a un peu un bogue

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

Considérez si le datepicker contient "77-78-7980" qui n'est évidemment pas une date valide. Cela entraînerait:

var f = new Date(7980, 77, 77);
=> Date 7986-08-15T22:00:00.000Z

Ce n'est probablement pas le résultat souhaité.

La raison en est expliquée sur le site MDN :

Lorsque Date est appelée en tant que constructeur avec plus d'un argument, si les valeurs sont supérieures à leur plage logique (par exemple, 13 est fourni comme valeur du mois ou 70 pour la valeur des minutes), la valeur adjacente sera ajustée. Par exemple, new Date(2013, 13, 1)équivaut à new Date(2014, 1, 1).


Une meilleure façon de résoudre le problème est:

const stringToDate = function(dateString) {
  const [dd, mm, yyyy] = dateString.split("-");
  return new Date(`${yyyy}-${mm}-${dd}`);
};

console.log(stringToDate('04-04-2019'));
// Date 2019-04-04T00:00:00.000Z

console.log(stringToDate('77-78-7980'));
// Invalid Date

Cela vous donne la possibilité de gérer une entrée invalide.

Par exemple:

const date = stringToDate("77-78-7980");

if (date === "Invalid Date" || isNaN(date)) {
  console.log("It's all gone bad");
} else {
  // Do something with your valid date here
}
James Hibbard
la source
1

Jetez un œil à Datejs pour tous ces petits problèmes liés aux dates. Vous pouvez également résoudre ce problème avec la fonction parseDate

Baz1nga
la source
0

Vous pouvez utiliser une expression régulière.

var result = /^(\d{2})-(\d{2})-(\d{4})$/.exec($("#datepicker").val());
if (result) {
    from = new Date(
        parseInt(result[3], 10), 
        parseInt(result[2], 10) - 1, 
        parseInt(result[1], 10)
    );
}
ChaosPandion
la source
Produit le mauvais mois! Les mois commencent à zéro, pas à un. Donc, si vous avez fait janvier, le vôtre dirait février
epascarello
1
@epascarello - J'ai oublié à quel point l'API Date est boiteuse.
ChaosPandion
@ChaosPandion: comment convertir maDate = '20 / 06/17 'au format '20 / 6/2017 00:00:00' en javascript?
Ghanshyam Lakhani
-1
new Date().toLocaleDateString();

aussi simple que cela, transmettez simplement votre date à js Date Object

Nikhil Sengar
la source
Voulez-vous dire en passant la chaîne de date à l'intérieur du constructeur Date comme, new Date('30/12/2018').toLocaleDateString()?? Cela renvoie une date invalide
Mme Tamil