1770 votes

Ajouter des jours à DateTime

Comment ajouter des jours à courant DateTime à l'aide de JavaScript. N'JavaScript ont une fonction intégrée comme .Net AddDay?

1817voto

AnthonyWJones Points 122520

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.

1151voto

sparebytes Points 1807

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

Cochez cette JsFiddle

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");
});

315voto

Joel Coehoorn Points 190579
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.

251voto

OneSHOT Points 4065

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!)

154voto

sbrbot Points 939

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.

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