Comment ajouter des jours à courant DateTime
à l'aide de JavaScript. N'JavaScript ont une fonction intégrée comme .Net AddDay
?
Réponses
Trop de publicités?Vous pouvez en créer un avec:-
Date.prototype.addDays = function(days)
{
var dat = new Date(this.valueOf());
dat.setDate(dat.getDate() + days);
return dat;
}
var dat = new Date();
alert(dat.addDays(5))
Le problème avec l'aide d' setDate
directement, c'est que c'est un mutateur et ce genre de chose, il vaut mieux éviter. L'ECMA a jugé bon de traiter l' Date
comme mutable une classe plutôt qu'à une structure immuable.
Le plus voté réponse a défaut fatal
Réponse Correcte:
function addDays(date, days) {
var result = new Date(date);
result.setDate(date.getDate() + days);
return result;
}
Réponse incorrecte par @OneShot:
Cette réponse parfois donne le résultat correct mais très souvent, renvoie l'erreur de l'année et le mois. La seule fois que la réponse œuvres, c'est quand la date à laquelle vous ajoutez des jours pour se le courant de l'année et le mois.
// Don't do it this way!
function addDaysWRONG(date, days) {
var result = new Date();
result.setDate(date.getDate() + days);
return result;
}
La Preuve / Exemple
HTML:
<table>
<tbody>
<tr>
<th colspan="4">DST Dates</th>
</tr>
<tr>
<th>Input</th>
<th>+1 Day</th>
<th>+1 Day Fail</th>
<th>+1 Day DST Fail</th>
</tr>
<tr><td>03/10/2013</td></tr>
<tr><td>11/03/2013</td></tr>
<tr><td>03/09/2014</td></tr>
<tr><td>11/02/2014</td></tr>
<tr><td>03/08/2015</td></tr>
<tr><td>11/01/2015</td></tr>
<tr>
<th colspan="4">2013</th>
</tr>
<tr>
<th>Input</th>
<th>+1 Day</th>
<th>+1 Day Fail</th>
<th>+1 Day DST Fail</th>
</tr>
<tr><td>01/01/2013</td></tr>
<tr><td>02/01/2013</td></tr>
<tr><td>03/01/2013</td></tr>
<tr><td>04/01/2013</td></tr>
<tr><td>05/01/2013</td></tr>
<tr><td>06/01/2013</td></tr>
<tr><td>07/01/2013</td></tr>
<tr><td>08/01/2013</td></tr>
<tr><td>09/01/2013</td></tr>
<tr><td>10/01/2013</td></tr>
<tr><td>11/01/2013</td></tr>
<tr><td>12/01/2013</td></tr>
<tr>
<th colspan="4">2014</th>
</tr>
<tr>
<th>Input</th>
<th>+1 Day</th>
<th>+1 Day Fail</th>
<th>+1 Day DST Fail</th>
</tr>
<tr><td>01/01/2014</td></tr>
<tr><td>02/01/2014</td></tr>
<tr><td>03/01/2014</td></tr>
<tr><td>04/01/2014</td></tr>
<tr><td>05/01/2014</td></tr>
<tr><td>06/01/2014</td></tr>
<tr><td>07/01/2014</td></tr>
<tr><td>08/01/2014</td></tr>
<tr><td>09/01/2014</td></tr>
<tr><td>10/01/2014</td></tr>
<tr><td>11/01/2014</td></tr>
<tr><td>12/01/2014</td></tr>
<tr>
<th colspan="4">2015</th>
</tr>
<tr>
<th>Input</th>
<th>+1 Day</th>
<th>+1 Day Fail</th>
<th>+1 Day DST Fail</th>
</tr>
<tr><td>01/01/2015</td></tr>
<tr><td>02/01/2015</td></tr>
<tr><td>03/01/2015</td></tr>
<tr><td>04/01/2015</td></tr>
<tr><td>05/01/2015</td></tr>
<tr><td>06/01/2015</td></tr>
<tr><td>07/01/2015</td></tr>
<tr><td>08/01/2015</td></tr>
<tr><td>09/01/2015</td></tr>
<tr><td>10/01/2015</td></tr>
<tr><td>11/01/2015</td></tr>
<tr><td>12/01/2015</td></tr>
</tbody>
</table>
CSS:
body {
font-size: 14px;
}
table {
border-collapse:collapse;
}
table, td, th {
border:1px solid black;
}
td {
padding: 2px;
}
.wrong {
color: red;
}
.right {
color: green;
}
.answer {
font-weight: bold;
}
JavaScript:
// Correct
function addDays(date, days) {
var result = new Date(date);
result.setDate(date.getDate() + days);
return result;
}
// Bad Year/Month
function addDaysWRONG(date, days) {
var result = new Date();
result.setDate(date.getDate() + days);
return result;
}
// Bad during DST
function addDaysDstFail(date, days) {
var dayms = (days * 24 * 60 * 60 * 1000);
return new Date(date.getTime() + dayms);
}
// TEST
function formatDate(date) {
return (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear();
}
$('tbody tr td:first-child').each(function () {
var $in = $(this);
var $out = $('<td/>').insertAfter($in).addClass("answer");
var $outFail = $('<td/>').insertAfter($out);
var $outDstFail = $('<td/>').insertAfter($outFail);
var date = new Date($in.text());
var correctDate = formatDate(addDays(date, 1));
var failDate = formatDate(addDaysWRONG(date, 1));
var failDstDate = formatDate(addDaysDstFail(date, 1));
$out.text(correctDate);
$outFail.text(failDate);
$outDstFail.text(failDstDate);
$outFail.addClass(correctDate == failDate ? "right" : "wrong");
$outDstFail.addClass(correctDate == failDstDate ? "right" : "wrong");
});
var today = new Date();
var tomorrow = new Date();
tomorrow.setDate(today.getDate()+1);
Soyez prudent, car cela peut être difficile. Lors de la définition de "demain", il ne fonctionne que parce qu'elle est la valeur actuelle correspond à l'année et le mois pour "aujourd'hui". Toutefois, la définition d'une date comme "32" normalement va toujours très bien fonctionner pour le déplacer pour le mois prochain.
Une solution générale à cette question est fournie par AnthonyWJones ci-dessous, alors que cette réponse va conduire à des bugs si vous supposez cela fonctionne arbitraire et les dates. Il n'y a pas de bonne raison d'utiliser cette solution comme la logique n'est pas clair et il va se casser en rien, mais la plupart des scénarios simplistes.
var today = new Date();
var tomorrow = new Date();
tomorrow.setDate(today.getDate()+1);
Cela permettra de traiter les fin de mois donc, l'ajout de 32 jours de travail.
Notez que cette approche ne tient pas si le 'de' Date
n'est pas dans la même année ou mois que le courant Date
:
var from = new Date('2010-12-20T00:00:00');
var to = new Date();
to.setDate(from.getDate() + 30); // Tue Nov 19 2013 (WRONG!)
Ma solution est la suivante:
nextday=new Date(oldDate.getFullYear(),oldDate.getMonth(),oldDate.getDate()+1);
cette solution n'a pas de problème avec l'heure d'été. Ici, vous pouvez ajouter/sub temps des compensations pour les années, les mois, les jours etc. Les décalages peuvent être n'importe quel nombre;
someday=new Date(oldDate.getFullYear()-2,oldDate.getMonth()+22,oldDate.getDate()+61);
est code est correct.