Adăugați zile de la Data JavaScript

Cum de a adăuga zile la curent "Data" folosind JavaScript. Nu JavaScript au o construit în funcție de ca .Net's AddDay?

Puteți crea unul cu:-

Date.prototype.addDays = function(days) {
    var date = new Date(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
}

var date = new Date();

alert(date.addDays(5));

Aceasta are grijă de automat incrementarea lună, dacă este necesar. De exemplu:

8/31 + 1 zi va deveni 9/1.

Problema cu folosirea setDate direct este ca's un mutator și că un fel de lucru este cel mai bine evitată. ECMA de cuviință să trateze "Data" ca un mutabil clasa, mai degrabă decât o imuabil structura.

Comentarii (16)

Răspuns Corect:

function addDays(date, days) {
  var result = new Date(date);
  result.setDate(result.getDate() + days);
  return result;
}

Răspuns Incorect:

Acest răspuns uneori oferă rezultatul corect dar de foarte multe ori se întoarce greșit an și o lună. Singura dată când acest răspuns este ca atunci când data la care sunteți adăugarea de zile pentru a se întâmplă să aibă actualul an și o lună.

// Don't do it this way!
function addDaysWRONG(date, days) {
  var result = new Date();
  result.setDate(date.getDate() + days);
  return result;
}

Dovada / Exemplu

[Bifați această JsFiddle][1]

// Correct
function addDays(date, days) {
    var result = new Date(date);
    result.setDate(result.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");
});
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;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<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>
Comentarii (18)
var today = new Date();
var tomorrow = new Date();
tomorrow.setDate(today.getDate()+1);

Fii atent, pentru că acest lucru poate fi dificil. Când setarea "de maine", funcționează doar pentru că's valoarea curentă meciuri anul și luna pentru "astazi". Cu toate acestea, la o întâlnire de genul "32" în mod normal, va funcționa în continuare bine pentru a trece la luna următoare.

Comentarii (7)

Mea simplă soluție este:

nextday=new Date(oldDate.getFullYear(),oldDate.getMonth(),oldDate.getDate()+1);

această soluție nu are o problemă cu lumina zilei de economisire de timp. De asemenea, se poate adăuga/sub orice offset de ani, luni, zile etc.

day=new Date(oldDate.getFullYear()-2,oldDate.getMonth()+22,oldDate.getDate()+61);

este codul corect.

Comentarii (7)

Aceste răspunsuri se pare confuz pentru mine, eu prefer:

var ms = new Date().getTime() + 86400000;
var tomorrow = new Date(ms);

getTime() ne oferă câteva milisecunde din 1970, și 86400000 este numărul de milisecunde într-o zi. Prin urmare, ms conține milisecunde pentru data dorită.

Folosind milisecundă constructorul dă data dorită obiect.

Comentarii (4)

Încercați

var someDate = new Date();
var duration = 2; //In Days
someDate.setTime(someDate.getTime() +  (duration * 24 * 60 * 60 * 1000));

Folosind setDate() pentru a adăuga o dată obiceiul de a rezolva problema, încercați să adăugați câteva zile la o luna Feb, dacă încercați să adăugați nouă zile la ea, nu se va duce la ceea ce v-ați așteptat.

Comentarii (5)

Doar petrecut o grămadă de timp încercând să dau seama ce afacere a fost cu an adăugarea când în urma duce exemplele de mai jos.

Dacă doriți să adăugați pur și simplu n zile de la data te-ai sunt cele mai bune pentru a merge doar:

myDate.setDate(myDate.getDate() + n);

sau întortocheat versiune

var theDate = new Date(2013, 11, 15);
var myNewDate = new Date(theDate);
myNewDate.setDate(myNewDate.getDate() + 30);
console.log(myNewDate);

Azi/maine lucrurile sunt confuze. Prin setarea datei curente în noua data variabilă va strica an valoare. daca lucrezi de la data inițială-ai câștigat't.

Comentarii (1)

Dacă puteți, folosiți moment.js. JavaScript nu't foarte bine nativ data/ora metode. Următorul este un exemplu de Moment's sintaxa:

var nextWeek = moment().add(7, 'days');
alert(nextWeek);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>

Referință: http://momentjs.com/docs/#/manipulating/add/

Comentarii (9)
int days = 1;
var newDate = new Date(Date.now() + days * 24*60*60*1000);

CodePen

var days = 2;
var newDate = new Date(Date.now() + days * 24*60*60*1000);

document.write('Today: <em>');
document.write(new Date());
document.write('</em><br/> New: <strong>');
document.write(newDate);
Comentarii (4)

Am creat aceste extensii de aseară: puteți trece, fie pozitive sau valori negative;

exemplu:

var someDate = new Date();
var expirationDate = someDate.addDays(10);
var previous = someDate.addDays(-5);

Date.prototype.addDays = function (num) {
    var value = this.valueOf();
    value += 86400000 * num;
    return new Date(value);
}

Date.prototype.addSeconds = function (num) {
    var value = this.valueOf();
    value += 1000 * num;
    return new Date(value);
}

Date.prototype.addMinutes = function (num) {
    var value = this.valueOf();
    value += 60000 * num;
    return new Date(value);
}

Date.prototype.addHours = function (num) {
    var value = this.valueOf();
    value += 3600000 * num;
    return new Date(value);
}

Date.prototype.addMonths = function (num) {
    var value = new Date(this.valueOf());

    var mo = this.getMonth();
    var yr = this.getYear();

    mo = (mo + num) % 12;
    if (0 > mo) {
        yr += (this.getMonth() + num - mo - 12) / 12;
        mo += 12;
    }
    else
        yr += ((this.getMonth() + num - mo) / 12);

    value.setMonth(mo);
    value.setYear(yr);
    return value;
}
Comentarii (3)

Cea mai simplă soluție.

 Date.prototype.addDays = function(days) {
   this.setDate(this.getDate() + parseInt(days));
   return this;
 };

 // and then call

 var newDate = new Date().addDays(2); //+2 days
 console.log(newDate);

 // or

 var newDate1 = new Date().addDays(-2); //-2 days
 console.log(newDate1);
Comentarii (2)

Fără a utiliza cea de-a doua variabilă, puteți înlocui 7 cu următorul x zile:

let d=new Date(new Date().getTime() + (7 * 24 * 60 * 60 * 1000));
Comentarii (0)

Multumesc Jason pentru răspunsul dumneavoastră, care funcționează cum era de așteptat, aici este un mix de la cod și la îndemână format de AnthonyWJones :

Date.prototype.addDays = function(days){
    var ms = new Date().getTime() + (86400000 * days);
    var added = new Date(ms);
    return added;
}
Comentarii (2)

Vechi știu, dar uneori îmi place asta:

function addDays(days) {
    return new Date(Date.now() + 864e5 * days);
}
Comentarii (4)

Târziu la petrecere, <grevă>dar dacă utilizați "jQuery" apoi nu's un excelent plugin numit Moment:

http://momentjs.com/

var myDateOfNowPlusThreeDays = moment().add(3, "days").toDate();

http://momentjs.com/docs/#/manipulating/

Și o mulțime de alte lucruri bune acolo!

Edit: jQuery referință eliminate datorită aikeru's comentariu

Comentarii (5)

Puteți utiliza JavaScript, nici jQuery necesare:

var someDate = new Date();
var numberOfDaysToAdd = 6;
someDate.setDate(someDate.getDate() + numberOfDaysToAdd); 
Formatting to dd/mm/yyyy :

var dd = someDate.getDate();
var mm = someDate.getMonth() + 1;
var y = someDate.getFullYear();

var someFormattedDate = dd + '/'+ mm + '/'+ y;
Comentarii (0)

Eu folosesc ceva de genul:

new Date(dateObject.getTime() + amountOfDays * 24 * 60 * 60 * 1000)

Lucrează cu ziua de economisire de timp:

new Date(new Date(2014, 2, 29, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000)

Funcționează cu noul an:

new Date(new Date(2014, 11, 31, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000)

Acesta poate fi parametrizat:

function DateAdd(source, amount, step) {
  var factor = 1;
  if (step == "day") factor = 24 * 60 * 60 * 1000;
  else if (step == "hour") factor = 60 * 60 * 1000;
  ...
  new Date(source.getTime() + amount * factor);
}
Comentarii (0)

Mozilla docs pentru setDate() nu't indică faptul că se va ocupa de sfârșitul lunii scenarii. A se vedea https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date

setDate()

  • Seturi de ziua din lună (1-31) pentru o dată specificată în funcție de ora locală.

De aceea eu folosesc setTime (), atunci când am nevoie pentru a adăuga zile.

Comentarii (2)

Nu, javascript nu are o construit în funcție, dar puteti folosi o simpla linie de cod

timeObject.setDate(timeObject.getDate() + countOfDays);
Comentarii (0)

Cred că'll să dea un răspuns cât de bine:
Personal, îmi place să încercați pentru a evita gratuit declarare variabile, apeluri de metode, și apeluri constructor, ca toate sunt scumpe pe performanță. (în termen de motiv, desigur)
Am fost de gând să părăsească acest lucru ca doar comentarii în Răspunsul dat de @AnthonyWJones dar a crezut mai bine de ea.

// Prototype usage...
Date.prototype.addDays = Date.prototype.addDays || function( days ) {
    return this.setTime( 864E5 * days + this.valueOf() ) && this;
};

// Namespace usage...
namespace.addDaysToDate = function( date, days ) {
    return date.setTime( 864E5 * days + date.valueOf() ) && date;
};

// Basic Function declaration...
function addDaysToDate( date, days ) {
    return date.setTime( 864E5 * days + date.valueOf() ) && date;
};

Cele de mai sus va respect DST. Sensul dacă adăugați un număr de zile care trec DST, afișat timp (ore) se va schimba pentru a reflecta faptul că.
Exemplu:
2 Nov 2014 02:00 a fost sfârșitul de DST.

var dt = new Date( 2014, 10, 1, 10, 30, 0 );
console.log( dt );                  // Sat Nov 01 2014 10:30:00
console.log( dt.addDays( 10 ) );    // Tue Nov 11 2014 09:30:00

Daca're în căutarea de a păstra timp de peste DST (deci 10:30 va fi în continuare 10:30)...

// Prototype usage...
Date.prototype.addDays = Date.prototype.addDays || function( days ) {
    return this.setDate( this.getDate() + days ) && this;
};

// Namespace usage...
namespace.addDaysToDate = function( date, days ) {
    return date.setDate( date.getDate() + days ) && date;
};

// Basic Function declaration...
function addDaysToDate( date, days ) {
    return date.setDate( date.getDate() + days ) && date;
};

Deci, acum aveți...

var dt = new Date( 2014, 10, 1, 10, 30, 0 );
console.log( dt );                  // Sat Nov 01 2014 10:30:00
console.log( dt.addDays( 10 ) );    // Tue Nov 11 2014 10:30:00
Comentarii (0)