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?
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)
}
exemple d'expression régulière:
new Date( "13-01-2011".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3") );
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
var from = $("#datepicker").val();
var f = $.datepicker.parseDate("d-m-Y", from);
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)
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
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)
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
Jetez un oeil à Datejs pour toutes ces questions relatives à la petite date .. Vous pouvez résoudre ce problème également avec la fonction parseDate
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
}
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)
);
}