Dodaj dni do daty JavaScript

1092

Jak dodać dni do prądu Dateza pomocą JavaScript. Czy JavaScript ma wbudowaną funkcję taką jak .Net AddDay?

Popiół
źródło

Odpowiedzi:

1208

Możesz go utworzyć za pomocą:

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

W razie potrzeby zapewnia to automatyczne zwiększenie miesiąca. Na przykład:

8/31 + 1 dzień zmieni się na 9/1 .

Problem z setDatebezpośrednim używaniem polega na tym, że jest to mutator i tego rodzaju rzeczy najlepiej unikać. ECMA uznał za stosowne potraktować Dateraczej klasę zmienną niż niezmienną strukturę.

AnthonyWJones
źródło
17
Uproszczony:Date.prototype.addDays=function(d){return new Date(this.valueOf()+864E5*d);};
Duncan
27
@ Duncan Czy na pewno jest to to samo co powyżej? Ten po prostu dodaje 24 godziny, ale jeden dzień nie zawsze jest 24 godziny . Myślę, że pytanie brzmi: jak zwiększyć część daty o 1 dzień, bez zmiany części czasu.
Tamás Bolvári,
88
864E5z jakiegoś powodu wolę pisać 24*60*60w moim kodzie :)
Mars Robertson
62
Chłopaki, nie używajcie metody dodawania 864E5, ponieważ nie bierze to różnicy czasu letniego, gdzie dni mogą wynosić 23 lub 25 godzin.
sbrbot
12
Dla tych, którzy martwią się o czas letni - nie rób tego. Algorytmy te zmieniają datę bazową, a nie sposób jej interpretacji. Czas letni jest zaimplementowany w pobierających i ustawiających datę - pobierający odejmują godzinę w lecie, a ustawiający dodają tę godzinę w lecie, aby znormalizować czas. Ale tylko przy użyciu godziny bezwzględnej - godzin względnych nie trzeba interpretować. Dlatego matematyka daty działa. IMHO ...
Gerard ONeill
754

Prawidłowa odpowiedź :

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

Niepoprawna odpowiedź :

Ta odpowiedź czasami zapewnia poprawny wynik, ale bardzo często zwraca niewłaściwy rok i miesiąc. Ta odpowiedź działa tylko wtedy, gdy data, do której dodajesz dni, przypada na bieżący rok i miesiąc.

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

Dowód / przykład

Sprawdź to JsFiddle

sparebytes
źródło
@bzlm, Tak, zasadniczo to samo. Po prostu nie modyfikuje prototypu Data. Chciałem również wskazać wady w głównej odpowiedzi.
sparebytes
Przyjęta odpowiedź została zredagowana dwa tygodnie temu, aby podkreślić jej wady. Czy uważasz, że wymaga dalszej edycji? Jeśli tak to jak?
bzlm
7
@bzlm: Tak, uważam, że notatka powinna brzmieć „to podejście kończy się niepowodzeniem, jeśli data„ od ”nie jest w tym samym roku lub miesiącu, co data bieżąca ”. Nadal martwię się, że użytkownicy przejrzą odpowiedź i nie przeczytają ostrzeżenia, ponieważ nie wyróżnia się. Dzięki.
sparebytes
3
Myślę, że nawet jeśli ta praca nie jest poprawna. Nie ma takiego konstruktora dla Date: var result = new Date (date); , patrz http://www.w3schools.com/js/js_dates.asp . Nawet jeśli to zwykle działa, czasami może prowadzić do błędnych wyników z powodu konwersji na ciąg znaków i odwrotnie. Powinien to być var result = new Date (date.getTime ());
Marcin
2
@AnkitBalyan, Zobacz inne odpowiedzi. Może nie działać poprawnie ze względu na czas letni
oszczędza
188
var today = new Date();
var tomorrow = new Date();
tomorrow.setDate(today.getDate()+1);

Uważaj, ponieważ może to być trudne. Ustawienie „jutro” działa tylko dlatego, że jego bieżąca wartość odpowiada rokowi i miesiącowi dla „dzisiaj”. Jednak ustawienie numeru daty, takiego jak „32”, normalnie nadal będzie działać dobrze, aby przenieść go na następny miesiąc.

Joel Coehoorn
źródło
1
Tak? Ale co to jest? (uruchomiono 31 marca 2010 r.): dzisiaj = nowa data (); jutro = nowa data (); tomorrow.setDate (Today.getDate () + 1); alert (tomorrow.getMonth ()); Mówi „3”. alarm (jutro); jest poprawne ... Dlaczego ???
d -_- b
12
Miesiąc @sims jest zindeksowany 0. Miesiąc 3 to kwiecień
Joel Coehoorn
6
Dlaczego trzeba utworzyć 2 osobne obiekty daty? Dlaczego po prostu nie korzystać z tego samego obiektu Date: var d = new Date(); d.setDate( d.getDate() + 1 );?
Joseph Silber,
8
To podejście nie działa przez lata. Jeśli data rozpoczęcia przypada kilka lat temu, getDate()zwraca dzień tego roku . Następnie dzwonienie setDateustawia dzień w bieżącym roku . Więc to NIE jest dobre ogólne rozwiązanie. @ Odpowiedź AnthonyWJones faktycznie działa poprawnie.
Drew Noakes
3
@ DrewNoakes - twoje twierdzenie, że nie działa przez lata, jest błędne. getDate zwraca dzień w miesiącu, a nie „dzień tego roku”. Np. var d = new Date(2015,11,30);d.setDate(d.getDate() + 370)Daje 3 stycznia 2017 r., Który przekracza 2 lata.
RobG,
123

Moje proste rozwiązanie to:

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

to rozwiązanie nie ma problemu z czasem letnim. Można również dodawać / subskrybować dowolne przesunięcie na lata, miesiące, dni itp.

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

jest poprawnym kodem.

sbrbot
źródło
13
Uwaga: resetuje czas do 00:00:00 (może być problem lub nie)
Álvaro González
Jak mówisz, nie działa w ostatnim dniu każdego miesiąca. Czyni to bezużytecznym przez 12 dni w roku. Brzmi jak koszmar do debugowania !!!
Drew Noakes
6
Nie Drew, nadaje się do użytku przez wszystkie dni w roku. Można ustawić przesunięcie daty większe niż 31 lub przesunięcie miesiąca większe niż 12, a ta funkcja ponownie przeliczy go jako dzień w następnym miesiącu lub miesiąc w przyszłym roku. Na przykład: nextday = nowa data (oldDate.getFullYear (), oldDate.getMonth (), oldDate.getDate () + 40); jest doskonale dobrze kodowany.
sbrbot,
jest getMonth () + 22 - jak myślisz, czy to zadziała !?
sbrbot
1
Zgadzam się, użyj tego sposobu. Właśnie mieliśmy błąd z powodu czasu letniego, ponieważ korzystaliśmy setDate.
Jelle,
95

Te odpowiedzi wydają mi się mylące, wolę:

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

getTime () daje nam milisekundy od 1970 roku, a 86400000 to liczba milisekund w ciągu dnia. Zatem ms zawiera milisekundy dla żądanej daty.

Użycie konstruktora milisekundowego daje pożądany obiekt daty.

Jason
źródło
46
To rozwiązanie nie uwzględnia oszczędności światła dziennego. Na przykład, to zwróci tę samą datę, 23 godziny później: new Date(new Date('11/4/2012').getTime() + 86400000)
Noah Harrison
6
@NoahMiller Problem, który poruszasz, może być funkcją, a nie błędem! Dodanie 24 godzin dziennie jest czasem właściwym rozwiązaniem, aby poznać wynikowy czas na podstawie czasu letniego. Data powrotu twojego przykładu ma wartość 23:00 4 listopada, czyli 24 godziny później tego konkretnego dnia. Oryginalny plakat zapytał o datę i godzinę, która wydaje się wskazywać na pragnienie prawidłowej pory dnia. Ta odpowiedź jest poprawna, jeśli Twoim celem jest czas 24 godziny później.
Andy Novocin,
3
Zgadzam się Noah, var d2 = nowa data (d1.valueOf () + 24 * 60 * 60 * 1000) robi to, co mówi, dodaje tyknięcia o wartości całego dnia.
Corey Alix,
6
Jest to absolutnie poprawne w niektórych przypadkach (na przykład w przypadku jednodniowych plików cookie) i prostsze rozwiązanie niż w większości innych. Nie rozumiem, dlaczego ma tak wiele głosów negatywnych i tak mało głosów pozytywnych: /
Matmarbon,
48

Próbować

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

Za pomocą setDate (), aby dodać datę, nie rozwiążesz problemu, spróbuj dodać kilka dni do miesiąca lutego, jeśli spróbujesz dodać do niej nowe dni, nie da to tego, czego się spodziewałeś.

sufyan.shoaib
źródło
26
Nie, nie należy tego zaznaczać jako poprawnej odpowiedzi, ponieważ w tym rozwiązaniu zakłada się, że każdy dzień ma 24 * 60 * 60 * 1000 sekund, ale tak nie jest (czas letni)!
sbrbot
Jakieś dowody na problem z lutem setDate()? Czy to tak: stackoverflow.com/questions/5497637/…
nobar
9
+1 To POWINNO być oznaczone jako poprawna odpowiedź. Uważam, że „czas letni” dotyczy prezentacji, a nie wartości , która jest tylko liczbą milisekund. Od wartości punktowej widzenia - jest liczba dni STAŁA z millisecs, natomiast pod względem prezentacji może się różnić.
rozproszony
1
@ disfated - to nie jest poprawna odpowiedź. Dzień wychodzący z czasu letniego ma 25 godzin, ale ta metoda dodaje tylko 24, więc data będzie taka sama. Używanie 24 godzin do reprezentowania dnia działa, jeśli zamiast tego stosowane są metody UTC, ale dlaczego zawracać sobie głowę używaniem setDate jest wygodniejsze? ;-)
RobG
38

Po prostu spędziłem wieki, próbując ustalić, jaka była umowa z rokiem, nie dodając, postępując zgodnie z poniższymi przykładami wiodącymi.

Jeśli chcesz po prostu dodać n dni do swojej daty, najlepiej po prostu przejść:

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

lub wersja z długim wiatrem

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

To dziś / jutro jest mylące. Ustawiając bieżącą datę w nowej zmiennej daty, zepsujesz wartość roku. jeśli pracujesz od pierwotnej daty, nie będziesz.

Rumpleteaser
źródło
7
Czytam wszystkie odpowiedzi, dopóki nie znajdę tutaj tego klejnotu. To ma sens. Zadziwiające, że dzisiejsza / jutrzejsza rzecz została skopiowana w prawie wszystkich odpowiedziach, kiedy nie ma to w ogóle sensu i nie jest „dla czytelności i jasności”, jak mówi autor w najbardziej uprzywilejowanej odpowiedzi - w najbardziej uprzywilejowanym komentarzu -, jest to mylące, zła praktyka i zło
Cesc
23

Jeśli możesz, użyj moment.js . JavaScript nie ma bardzo dobrych metod natywnej daty / godziny. Oto przykładowa składnia Moment:

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>

Odniesienie: http://momentjs.com/docs/#/manipicing/add/

użytkownik2910265
źródło
1
@ kpull1 pytający nie ograniczył domeny rozwiązania, pytając, czy istnieje rozwiązanie wbudowane.
user2910265,
4
Nowoczesna uwaga: Moment.js jest niezwykle ciężki do dodania do tak małego celu. Ma kilkaset KB i nie jest gotowy do instalacji w pakiecie.
Joshua Comeau
1
Naszą preferowaną biblioteką jest data-fns. Przyjazny dla Webpack, szybki i traktuje Daty jako niezmienne.
Freewalker
1
@LukeWilliams do tej pory nigdy nie słyszał o date-fns. sprawdzi to. dzięki.
user2910265
2
@JoshuaComeau Jeśli pobierzesz go z cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.3/moment.min.js , zajmuje on 53 248 bajtów na dysku. Wyobrażam sobie, że to cała kulka wosku, ale nie wiem. W każdym razie cokolwiek. To nie jest wielka sprawa.
birdus
22
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);

Serge
źródło
2
Głosuj za nie wymaganie pośredniej zmiennej daty.
Jeff Lowery
to najlepsza odpowiedź, ponieważ nie ma mutacji
knocte
Nie każdy dzień ma 24 godziny, kończy się niepowodzeniem dla czasu letniego i sekund przestępnych.
Stephan
19

Te rozszerzenia utworzyłem ostatniej nocy:
możesz przekazać wartości dodatnie lub ujemne;

przykład:

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;
}
mark.nino.chua
źródło
7
Metoda .addDays () nie działa dla dat przekraczających granice czasu letniego.
mskfisher
1
Jest to jedna z lepszych odpowiedzi tutaj, ponieważ (poprawnie) używasz liczby milis od epoc do reprezentowania dat / godzin i dodajesz ilości milis do korekt ... Dlaczego więc nie nadążałeś za tym w „addMonths”! ? A dlaczego nie dodać roku? Znudziło ci się?
Robin,
Inne niż miesiące, przedziały czasowe mogą być reprezentowane przez liczby statyczne. Ale miesiące mogą mieć cztery różne długości. Ponadto dowolna długość okresu od Dni i więcej może mieć zmienną długość w czasie DST, więc nie można już używać dodawania opartego na czasie bez kolejnego poziomu złożoności. Dodałem addYears () i naprawiłem addMonths ().
Suamere
14

Bez użycia drugiej zmiennej możesz zastąpić 7 następnymi x dniami:

let d=new Date(new Date().getTime() + (7 * 24 * 60 * 60 * 1000));
vaibhavmaster
źródło
14

odjąć 30 dni użytkowania (24h = 86400000 ms)

new Date(+yourDate - 30 *86400000)

Kamil Kiełczewski
źródło
Próbując obliczyć datę i czas, zawsze pamiętaj o tej godzinie w oparciu o milisekundy w informatyce, ( en.wikipedia.org/wiki/System_time#Retrieving_system_time ) nowa data (+ twoja data + 30 * (24 * 60 * 60 * 1000))
Ashraf Abusada
13

Najprostsze rozwiązanie.

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

ampachty
źródło
Myślę, że to najlepsze rozwiązanie. Jeśli rozszerzamy klasę Date, wówczas lepiej jest zaktualizować samą instancję Date.
Porlune
10

Dziękuję Jasonowi za odpowiedź, która działa zgodnie z oczekiwaniami, oto mieszanka kodu i przydatnego formatu AnthonyWJones:

Date.prototype.addDays = function(days){
    var ms = new Date().getTime() + (86400000 * days);
    var added = new Date(ms);
    return added;
}
Olivier
źródło
6
Nie bierze pod uwagę czasu letniego, gdy dziennie jest więcej lub mniej niż 86400000 sekund i może powodować błąd logiczny (błąd programu) w kodzie.
sbrbot
Czasami jest to potrzebne. EBay API ma aukcje x-day, które są oparte na 24-godzinnym, więc twój przedmiot skończy się w innym czasie niż wzrośnie, jeśli status DST zmieni się w połowie aukcji. W takim przypadku musisz użyć tego typu funkcji, aby uniknąć błędów logicznych.
Andy Novocin
10

Późno do partii, ale jeśli używasz jQuerywtedy tam doskonały plugin o nazwie Moment:

http://momentjs.com/

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

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

I jest tam wiele innych dobrych rzeczy!

Edycja: odniesienie do jQuery zostało usunięte dzięki komentarzowi aikeru

RemarkLima
źródło
1
chwila nie potrzebuje jQuery :)
aikeru
W tym przypadku jeszcze lepiej !!
RemarkLima,
1
Tak, po zbyt długim spędzaniu czasu z Plain ol 'JS, użyłem Moment i to po prostu działa (tm)!
caseyamcl
Dlaczego chcesz korzystać z wtyczki, gdy zrobi to kilka wierszy JS?
frenchie
@frenchie, ponieważ, co zaczyna się jako kilka wierszy JS i ponieważ twoja aplikacja manipuluje dniami, datami i informacjami związanymi z czasem, wkrótce będzie kilka tysięcy wierszy JS, wtedy zostaniesz poproszony o lokalizację aplikacji w poprzek 12 języków i stref czasowych i
żałowałbyś,
10

Rozwiązanie zaprojektowane dla operatora rurociągu :

const addDays = days => date => {
  const result = new Date(date);

  result.setDate(result.getDate() + days);

  return result;
};

Stosowanie:

// Without the pipeline operator...
addDays(7)(new Date());

// And with the pipeline operator...
new Date() |> addDays(7);

Jeśli potrzebujesz więcej funkcji, sugeruję zajrzenie do biblioteki date-fns .

sdgfsdh
źródło
8

Stary, wiem, ale czasem mi się podoba:

function addDays(days) {
    return new Date(Date.now() + 864e5 * days);
}
Todd
źródło
2
Ten ma dla mnie sens. Jest to proste, eleganckie i nie należy się modlić do problemów poruszających się przez miesiące / lata.
uadrive
1
Najprostsza z przedstawionych odpowiedzi. Na tej podstawie prototyp „addDays” wyglądałby następująco:Date.prototype.addDays = function(days) {return new Date(this.getTime() + (864e5 * days));};
CrazyIvan1974
Nie każdy dzień ma 24 godziny, kończy się niepowodzeniem dla czasu letniego i sekund przestępnych.
Stephan
8

Miałem problemy z czasem letnim związanym z proponowanym rozwiązaniem.

Używając getUTCDate/ setUTCDatezamiast, rozwiązałem swój problem.

// Curried, so that I can create helper functions like `add1Day`
const addDays = num => date => {
  // Make a working copy so we don't mutate the supplied date.
  const d = new Date(date);

  d.setUTCDate(d.getUTCDate() + num);

  return d;
}
Joshua Comeau
źródło
8

Możesz używać JavaScript, nie wymaga jQuery:

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;
Rohit.007
źródło
8

Ogólny prototyp bez zmiennych, ma zastosowanie do istniejącej wartości daty:

Date.prototype.addDays = function (days) {
    return new Date(this.valueOf() + days * 864e5);
}
Matteo Conta
źródło
7

Dokumenty mozilla dla setDate () nie wskazują, że będzie on obsługiwał scenariusze na koniec miesiąca. Zobacz https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date

ustawić datę()

  • Ustawia dzień miesiąca (1-31) dla określonej daty zgodnie z czasem lokalnym.

Dlatego używam setTime (), kiedy muszę dodać dni.

Blake Mills
źródło
Odsyłam link do dokumentów ECMAScript, ale są one opublikowane w formacie PDF; (
Blake Mills,
1
Re „ dokumenty mozilla dla setDate () nie wskazują, że będzie on obsługiwał scenariusze na koniec miesiąca ”. „Dokumenty” zostały zaktualizowane, więc teraz to robią. ;-)
RobG
7

Tak proste jak to:

new Date((new Date()).getTime() + (60*60*24*1000));
Dila Gurung
źródło
2
Chociaż dodaje to dni UTC, wykorzystuje metody lokalne i nie dopuszcza dni lokalnych, które nie trwają 24 godziny, co ma miejsce, gdy zmienia się przesunięcie strefy czasowej (np. Czas letni i zimowy).
RobG
6

Wydaje mi się, że dam również odpowiedź:
osobiście lubię próbować unikać nieuzasadnionej deklaracji zmiennych, wywołań metod i wywołań konstruktorów, ponieważ wszystkie one są drogie pod względem wydajności. (oczywiście w granicach rozsądku)
zamierzałem zostawić to jako komentarz pod odpowiedzią udzieloną przez @AnthonyWJones, ale lepiej się nad tym zastanowić.

// 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;
};

Powyższe będzie przestrzegać DST. Oznacza to, że jeśli dodasz liczbę dni przekraczających czas letni, wyświetlany czas (godzina) zmieni się, aby to odzwierciedlić.
Przykład:
2 listopada 2014 02:00 był końcem czasu letniego.

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

Jeśli chcesz zachować czas w DST (więc 10:30 nadal będzie 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;
};

Więc teraz masz ...

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
Duncan
źródło
6

Nie, javascript nie ma wbudowanej funkcji, ale możesz użyć prostej linii kodu

timeObject.setDate(timeObject.getDate() + countOfDays);
Vahag Chakhoyan
źródło
5

Używam czegoś takiego jak:

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

Działa z oszczędnością czasu:

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

Działa z nowym rokiem:

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

Można go sparametryzować:

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);
}
kpull1
źródło
4

Korzystam z następującego rozwiązania.

var msInDay = 86400000;
var daysToAdd = 5;
var now = new Date();
var milliseconds = now.getTime();
var newMillisecods = milliseconds + msInDay * daysToAdd;
var newDate = new Date(newMillisecods);
//or now.setTime(newMillisecods);

Date ma konstruktor, który akceptuje liczbę całkowitą. Ten argument reprezentuje całkowitą liczbę milisekund przed / po 1 stycznia 1970 r. Posiada również metodę setTime, która robi to samo bez tworzenia nowego obiektu Date.

To, co tutaj robimy, to konwersja dni na milisekundy i dodanie tej wartości do wartości podanej przez getTime. Na koniec podajemy wynik konstruktorowi Date (milisekundy) lub metodzie setTime (milisekundy).

Vakhtang
źródło
Nie każdy dzień ma 24 godziny, kończy się niepowodzeniem dla czasu letniego i sekund przestępnych.
Stephan
Stephan, czy ma to jakieś inne biblioteki?
Vakhtang
now.setDate(now.getDate() + days);automatycznie obsługuje zmiany czasu letniego. I muszę poprawić, sekundy przestępne są ignorowane w znacznikach czasu JS.
Stephan
4

Edycja: Zamiast setTime()(lub setHours()) możesz to zrobić w ten sposób:

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

var tomorrow = new Date().addDays(1);

Stary:

Zamiast używać setTime()możesz użyć setHours():

Date.prototype.addDays= function(d){
    this.setHours(this.getHours() + d * 24);
    return this;
};

var tomorrow = new Date().addDays(1);

Zobacz JSFiddle ...

spaark
źródło
kierując się tą logiką, można również dodać jeden dzień;)d.setDate(d.getDate() + 1);
Rivenfall
4

Bardzo prosty kod do dodawania dni w skrypcie Java.

var d = new Date();
d.setDate(d.getDate() + prompt('how many days you want to add write here'));
alert(d);

Rana Aalamgeer
źródło
4

Istnieje metoda setDate i getDate , które pozwalają zrobić coś takiego:

var newDate = aDate.setDate(aDate.getDate() + numberOfDays);

Jeśli chcesz odjąć liczbę dni i sformatować datę w formacie czytelnym dla człowieka, powinieneś rozważyć utworzenie niestandardowego DateHelperobiektu, który wygląda mniej więcej tak:

var DateHelper = {
    addDays : function(aDate, numberOfDays) {
        aDate.setDate(aDate.getDate() + numberOfDays); // Add numberOfDays
        return aDate;                                  // Return the date
    },
    format : function format(date) {
        return [
           ("0" + date.getDate()).slice(-2),           // Get day and pad it with zeroes
           ("0" + (date.getMonth()+1)).slice(-2),      // Get month and pad it with zeroes
           date.getFullYear()                          // Get full year
        ].join('/');                                   // Glue the pieces together
    }
}

// With this helper, you can now just use one line of readable code to :
// ---------------------------------------------------------------------
// 1. Get the current date
// 2. Add 20 days
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), 20));

(zobacz także to skrzypce )

John Slegers
źródło
4

Rozszerzenie prototypu w javascript może nie być dobrym pomysłem , szczególnie w profesjonalnych kodach.

Co chcesz zrobić, to rozszerzyć Dateklasę natywną :

class MyCustomDate extends Date {

  addDays(days) {
    const date = new MyCustomDate(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
  }
  
}

const today = new MyCustomDate();

const nextWeek = today.addDays(7)

console.log(nextWeek)

W ten sposób, jeśli pewnego dnia JavaScript wdroży natywną addDaysmetodę, niczego nie zepsujesz.

Creaforge
źródło