web-dev-qa-db-fra.com

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

j'essaie de convertir une chaîne au format jj-mm-aaaa en un objet de date en JavaScript en utilisant les éléments suivants:

 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 une "date invalide":

alert(f);

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

167
user559142

Split sur "-"

Analyser 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])

tilisez 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 traits d'union.

Cependant, si vous cherchiez la même chaîne dans une autre chaîne, regex serait la solution.

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, intégrez-le dans une fonction:

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

Utilisant comme:

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

Ou si cela ne vous dérange pas que jQuery occupe votre fonction:

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

Utilisant comme:

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

JavaScript moderne

Si vous parvenez à utiliser un JS plus moderne, la déstructuration des tableaux est une touche agréable aussi:

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

exemple d'expression régulière:

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

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

14
Joe
var from = $("#datepicker").val(); 
var f = $.datepicker.parseDate("d-m-Y", from);
6
Saad Imran.

En utilisant moment.js exemple:

var from = '11-04-2017' // OR $("#datepicker").val();
var milliseconds = moment(from, "DD-MM-YYYY").format('x');
var f = new Date(milliseconds)
6
Makah

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: lundi 02 novembre 2015 04:40:13 GMT + 0100 (CET) puis j'utilise .getTime () pour travailler avec des millisecondes

3
argene santoni

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

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

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)
3
Prisoner ZERO

Vous pouvez utiliser une bibliothèque externe pour vous aider.

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

getDateFromFormat(val,format);

Voir aussi ceci: Chaîne DateTime en JavaScript

2
wesbos

Jetez un oeil à Datejs pour toutes ces questions relatives à la petite date .. Vous pouvez résoudre ce problème également avec la fonction parseDate

1
Baz1nga

La réponse acceptée a un bug

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

Déterminez si le sélecteur de date contient "77-78-7980", ce qui n'est évidemment pas une date valide. Cela se traduirait par:

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

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

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

Lorsque Date est appelé en tant que constructeur avec plusieurs arguments, si les valeurs sont supérieures à leur plage logique (par exemple, 13 correspond à la valeur du mois ou 70 à la minute), la valeur adjacente sera ajustée. Par exemple. new Date(2013, 13, 1) est équivalent à new Date(2014, 1, 1).


Un meilleur moyen 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 des entrées non valides.

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
}
0
James Hibbard

Vous pouvez utiliser une expression rationnelle.

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)
    );
}
0
ChaosPandion