Subtrahieren Sie Tage von einem Datum in JavaScript


603

Kennt jemand eine einfache Möglichkeit, ein Date zu nehmen (z. B. Heute) und X Tage zurück zu gehen?

Zum Beispiel, wenn ich das Datum 5 Tage vor dem heutigen Tag berechnen möchte.


4
Ich habe Probleme mit der akzeptierten Antwort gefunden. Anscheinend funktioniert die Verwendung negativer Werte in setDate () nicht wie erwartet. Eine andere (bessere?) Lösung finden Sie unter stackoverflow.com/a/9037132/792287 .
Vandiedakaf


Antworten:


961

Versuchen Sie so etwas:

 var d = new Date();
 d.setDate(d.getDate()-5);

Beachten Sie, dass dies das Datumsobjekt ändert und den Zeitwert des aktualisierten Datums zurückgibt.

var d = new Date();

document.write('Today is: ' + d.toLocaleString());

d.setDate(d.getDate() - 5);

document.write('<br>5 days ago was: ' + d.toLocaleString());


9
Die Ausgabe davon gibt mir eine lange Folge von ganzen Zahlen. Irgendeine Idee, wie man es in den 14.05.2012 formatiert?
user525146

162
Angesichts der Tatsache, dass dies ganz oben auf Google steht, würde ich den obigen Kommentar wahrscheinlich beantworten: new Date(new Date().setDate(new Date().getDate()-5))- Das wird vor 5 Tagen sein. Übergeben Sie im Beispiel der Antwort ein neues Datum, um ein Datumsobjekt zu erhalten. Also new Date(d)ist was du willst.
Jesse

8
Das Problem dabei ist, dass Sie möglicherweise 00 erhalten, was kein gültiger Wert für das Datum ist.
DominicM

24
setDate(-1)wird das Datum auf den letzten Tag des Monats setzen
Peter

5
@ user525146 fragte, wie die Nummer formatiert werden soll, nicht wie die Nummer lautet. Herablassende Antworten sind nicht erforderlich. So formatieren Sie die Nummer ein , verwenden Sie eine der Datum toStringMethoden wie toISOString, toDateStringetc.
Bad Request

83
var dateOffset = (24*60*60*1000) * 5; //5 days
var myDate = new Date();
myDate.setTime(myDate.getTime() - dateOffset);

Wenn Sie in Ihrer Webanwendung viele Manipulationen an Kopfschmerzen durchführen , erleichtert DateJS Ihnen das Leben erheblich:

http://simonwillison.net/2007/Dec/3/datejs/


23
Es ist ein Randfall, aber dies kann zu Beginn / Ende der Sommerzeit fehlschlagen. Sie subtrahieren nicht 5 Tage, sondern 5 * 24 Stunden. Der erste Tag der Sommerzeit beträgt nur 23 Stunden und der letzte 25 Stunden. Normalerweise spielt es keine Rolle, aber es ist etwas zu beachten.
Kip

11
@Kip Ich hasse Sommerzeit ... und Zeitzonen. Wir sollten alle zu GMT wechseln.
Cwallenpoole

6
@cwallenpoole, um Ihre Blase nicht zu platzen, aber sie verwenden Sommerzeit sogar in Greenwich. Wenn Sie also wirklich auf GMT sein möchten, sind Sie auf Island und einige westafrikanische Länder beschränkt.
Kip

1
Das Problem mit dieser Methode ist, dass es nicht mit Neujahr usw. funktioniert
Daniel Williams

4
@danielWilliams Wie funktioniert das nicht mit einem neuen Jahr? getTime()und setTime()sind Millisekunden seit der Epoche. Es sollte keine Rolle spielen, ob die Zeit eine Jahresgrenze überschreitet.
Mashmagar

52

Es geht ungefähr so:

var d = new Date(); // today!
var x = 5; // go back 5 days!
d.setDate(d.getDate() - x);

Die Ausgabe davon gibt mir eine lange Folge von ganzen Zahlen. Irgendeine Idee, wie man es in den 14.05.2012 formatiert?
user525146

7
Der Rückgabewert von d.setDate ist in der Tat ein ganzzahliger Wert. Der Rückgabewert interessiert Sie an dieser Stelle jedoch wahrscheinlich nicht wirklich, da der tatsächliche Wert von "d" geändert wurde. Ihre eigentliche Frage ist nun, wie Sie Ihr Datum formatieren, das jetzt in "d" steht und nicht den Rückgabewert von setDate. (Nun, es ist tatsächlich der Rückgabewert, aber es ist zu diesem Zeitpunkt kein Datum und ich möchte Sie nicht verwirren - verwenden Sie einfach d, es wird schneller sein). Zum Formatieren von Daten benötigen Sie die Methoden d.getMonth (), d.getFullYear () und d.getDate (). Sie möchten einen zu d.getMonth () hinzufügen, da Jan 0 ist.
Chris Nielsen

2
Als einfache Methode: function getDaysAgo(b){var a=new Date;a.setDate(a.getDate()-b);return a};dann nurvar daysAgo45 = getDaysAgo(45);
SpYk3HH

@MiroKrsjak Natürlich funktioniert dies, wenn Sie das Monatsende / den Monatsbeginn überschreiten. Warum sollte es nicht funktionieren?
Chris Nielsen

23

Ich habe festgestellt, dass getDays + X nicht über Tages- / Monatsgrenzen hinweg funktioniert. Die Verwendung von getTime funktioniert, solange Ihr Datum nicht vor 1970 liegt.

var todayDate = new Date(), weekDate = new Date();
weekDate.setTime(todayDate.getTime()-(7*24*3600000));

3
Mir ist das auch aufgefallen. Ich bin mehr überrascht, oder fehlt mir etwas?
Sean Glover

11
Dies ist falsch. Mit new Date (). SetDate (-1) erhalten Sie den letzten Tag des Vormonats.
Zbrunson

2
Dies ist auch im Randfall des Beginns / Endes der Sommerzeit falsch. Ihr Ansatz subtrahiert 7 * 24 Stunden, unter der Annahme, dass jeder Tag 24 Stunden hat. Der erste Tag der Sommerzeit dauert nur 23 Stunden und der letzte Tag 25 Stunden. setDate (getDate () - 7) hat dieses Problem nicht.
Kip

1
getTime arbeitet mit der Weltzeit. Subtrahiert also korrekt 7 Tage Zeit vom Datumsobjekt. Wenn Sie es in eine Zeichenfolge in Ihrer angegebenen Zeitzone konvertieren, wird die Zeit für diese Zone korrekt angezeigt.
Awjr

Seien Sie am Tag der Zeitumstellung vorsichtig. Wenn wir im Herbst zurückfallen, hat dieser Tag 25 Stunden. Wenn Sie also 24 Stunden von Mitternacht abziehen, landen Sie am selben Tag. Diese Technik (Subtrahieren von Millisekunden) funktioniert jedoch, wenn Sie den Tag nach jeder Operation auf Mitternacht abrunden. Sie können dies tun, indem Sie zuerst 12 Stunden hinzufügen und dann die Stunden auf Null setzen.
Magmatische

18

Holen Sie sich moment.js. Alle coolen Kids benutzen es. Es hat mehr Formatierungsoptionen usw. Wo

var n = 5;
var dateMnsFive = moment(<your date>).subtract(n , 'day');

Optional! Konvertieren Sie in JS Date obj für die Winkelbindung.

var date = new Date(dateMnsFive.toISOString());

Optional! Format

var date = dateMnsFive.format("YYYY-MM-DD");

Wenn Sie Ihr Datum in den Moment verschieben, erhalten Sie Warnungen. Verfallswarnung: Der angegebene Wert hat kein anerkanntes RFC2822- oder ISO-Format. Moment Konstruktion fällt auf js Date () zurück, was nicht für alle Browser und Versionen zuverlässig ist. Nicht-RFC2822 / ISO-Datumsformate werden nicht empfohlen und in einer kommenden Hauptversion entfernt. Weitere Informationen finden Sie unter momentjs.com/guides/#/warnings/js-date .
Wechseln Sie

13

Ich habe diesen Prototyp für Datum erstellt, damit ich negative Werte zum Subtrahieren von Tagen und positive Werte zum Hinzufügen von Tagen übergeben kann.

if(!Date.prototype.adjustDate){
    Date.prototype.adjustDate = function(days){
        var date;

        days = days || 0;

        if(days === 0){
            date = new Date( this.getTime() );
        } else if(days > 0) {
            date = new Date( this.getTime() );

            date.setDate(date.getDate() + days);
        } else {
            date = new Date(
                this.getFullYear(),
                this.getMonth(),
                this.getDate() - Math.abs(days),
                this.getHours(),
                this.getMinutes(),
                this.getSeconds(),
                this.getMilliseconds()
            );
        }

        this.setTime(date.getTime());

        return this;
    };
}

Um es zu benutzen, kann ich einfach schreiben:

var date_subtract = new Date().adjustDate(-4),
    date_add = new Date().adjustDate(4);

2
Sie können d.setDate(d.getDate() + days)sowohl positive als auch negative Werte für Tage verwenden , um Tage zu addieren bzw. zu subtrahieren. Und es sollte auf der Instanz funktionieren (wie andere Date-Methoden), keine Kopie erstellen und zurückgeben.
RobG

13

Einige der vorhandenen Lösungen waren nah beieinander, aber nicht ganz genau das, was ich wollte. Diese Funktion arbeitet sowohl mit positiven als auch mit negativen Werten und behandelt Grenzfälle.

function addDays(date, days) {
    return new Date(
        date.getFullYear(),
        date.getMonth(),
        date.getDate() + days,
        date.getHours(),
        date.getMinutes(),
        date.getSeconds(),
        date.getMilliseconds()
    );
}

2
Wird es auf den nächsten Monat übertragen, wenn ich mit dieser Methode 20 Tage zum 15. des aktuellen Monats hinzufüge? Es scheint nicht.
Bora

2
@Bora - ja, es erhöht den Monat bei Bedarf korrekt. Wenn Sie beispielsweise 20 Tage zum 15. August hinzufügen: addDays (neues Datum (2015, 07, 15), 20) wird "Fr 04 Sep 2015 00:00:00 GMT-0700 (PDT)" zurückgegeben
Joel Fillmore

12

Ich rechne gerne in Millisekunden. Also benutzeDate.now()

var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds

und wenn Sie es formatiert mögen

new Date(newDate).toString(); // or .toUTCString or .toISOString ...

HINWEIS: Funktioniert Date.now()nicht in älteren Browsern (zB IE8, glaube ich). Polyfill hier .

UPDATE Juni 2015

@socketpair wies auf meine Schlamperei hin. Wie er / sie sagt "Einige Tage im Jahr haben 23 Stunden und einige 25 aufgrund von Zeitzonenregeln".

Um dies zu erweitern, weist die obige Antwort Ungenauigkeiten bei der Sommerzeit auf, wenn Sie den LOKALEN Tag vor 5 Tagen in einer Zeitzone mit Änderungen bei der Sommerzeit berechnen möchten

  • nehme (falsch) an, dass Date.now() Sie jetzt die aktuelle LOKALE Zeit haben, oder
  • Verwendung, .toString()die das lokale Datum zurückgibt und daher nicht mit dem Date.now()Basisdatum in UTC kompatibel ist .

Es funktioniert jedoch, wenn Sie alle Berechnungen in UTC durchführen, z

A. Sie möchten das UTC-Datum vor 5 Tagen von JETZT (UTC)

var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds UTC
new Date(newDate).toUTCString(); // or .toISOString(), BUT NOT toString

B. Sie beginnen mit einem anderen UTC-Basisdatum als "jetzt" Date.UTC()

newDate = new Date(Date.UTC(2015, 3, 1)).getTime() + -5*24*3600000;
new Date(newDate).toUTCString(); // or .toISOString BUT NOT toString

3
Das ist nicht genau. Einige Tage im Jahr haben 23 Stunden und einige 25 aufgrund von Zeitzonenregeln.
Socketpair

Ich würde mir Sorgen über Fehlerbedingungen machen, wenn es Schaltsekunden gibt ... also vielleicht nicht gut für kritischen Code.
Robocat

12

Ich finde ein Problem mit der Methode getDate () / setDate () darin, dass sie zu leicht alles in Millisekunden umwandelt und die Syntax manchmal für mich schwer zu befolgen ist.

Stattdessen möchte ich die Tatsache abarbeiten, dass 1 Tag = 86.400.000 Millisekunden.

Also, für Ihre spezielle Frage:

today = new Date()
days = 86400000 //number of milliseconds in a day
fiveDaysAgo = new Date(today - (5*days))

Klappt wunderbar.

Ich benutze diese Methode die ganze Zeit, um rollierende 30/60/365-Tage-Berechnungen durchzuführen.

Sie können dies leicht extrapolieren, um Zeiteinheiten für Monate, Jahre usw. zu erstellen.


11

Teilen Sie Ihr Datum in Teile auf und geben Sie dann ein neues Datum mit den angepassten Werten zurück

function DateAdd(date, type, amount){
    var y = date.getFullYear(),
        m = date.getMonth(),
        d = date.getDate();
    if(type === 'y'){
        y += amount;
    };
    if(type === 'm'){
        m += amount;
    };
    if(type === 'd'){
        d += amount;
    };
    return new Date(y, m, d);
}

Denken Sie daran, dass die Monate auf Null basieren, die Tage jedoch nicht. dh neues Datum (2009, 1, 1) == 01. Februar 2009, neues Datum (2009, 1, 0) == 31. Januar 2009;


2
Was passiert, wenn Sie auf diese Weise beispielsweise 50 Tage zu einem Datum hinzufügen? Wird das Datum auf den 68. August 2009 festgelegt? Oder sind Sie sicher, dass dies immer korrekt auf den entsprechenden Monat und / oder das richtige Jahr übertragen wird?
Jesper

Verwendet dies, um addDays, addMonths und addYears zu Date.prototype hinzuzufügen. Schön und einfach.
Scott Isaacs

1
Dies sollte die richtige Antwort sein - sie funktioniert auch am letzten Tag des Jahres, an dem die akzeptierte Antwort fehlschlägt.
Kris

Funktioniert nicht für Daten mit Jahren von 1 bis 99. ;-) Es ist viel besser, nur die Methoden get * und set * zu verwenden.
RobG

8

Ohne die zweite Variable zu verwenden, können Sie 7 durch Ihre Rücken x Tage ersetzen:

let d=new Date(new Date().getTime() - (7 * 24 * 60 * 60 * 1000))

5

function addDays (date, daysToAdd) {
  var _24HoursInMilliseconds = 86400000;
  return new Date(date.getTime() + daysToAdd * _24HoursInMilliseconds);
};

var now = new Date();

var yesterday = addDays(now, - 1);

var tomorrow = addDays(now, 1);


2

Ich habe eine Funktion zur Datumsmanipulation erstellt. Sie können beliebig viele Tage, Stunden, Minuten addieren oder subtrahieren.

function dateManipulation(date, days, hrs, mins, operator) {
   date = new Date(date);
   if (operator == "-") {
      var durationInMs = (((24 * days) * 60) + (hrs * 60) + mins) * 60000;
      var newDate = new Date(date.getTime() - durationInMs);
   } else {
      var durationInMs = (((24 * days) * 60) + (hrs * 60) + mins) * 60000;
      var newDate = new Date(date.getTime() + durationInMs);
   }
   return newDate;
 }

Rufen Sie diese Funktion nun auf, indem Sie Parameter übergeben. Hier ist beispielsweise ein Funktionsaufruf zum Abrufen des Datums vor 3 Tagen ab heute.

var today = new Date();
var newDate = dateManipulation(today, 3, 0, 0, "-");

2

Verwenden Sie MomentJS .

function getXDaysBeforeDate(referenceDate, x) {
  return moment(referenceDate).subtract(x , 'day').format('MMMM Do YYYY, h:mm:ss a');
}

var yourDate = new Date(); // let's say today
var valueOfX = 7; // let's say 7 days before

console.log(getXDaysBeforeDate(yourDate, valueOfX));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>


1

Die häufigsten Antworten führten zu einem Fehler in meinem Code, bei dem am ersten des Monats ein zukünftiges Datum für den aktuellen Monat festgelegt wurde. Folgendes habe ich getan:

curDate = new Date(); // Took current date as an example
prvDate = new Date(0); // Date set to epoch 0
prvDate.setUTCMilliseconds((curDate - (5 * 24 * 60 * 60 * 1000))); //Set epoch time


0

Ich mag das Folgende, weil es eine Zeile ist. Nicht perfekt mit DST-Änderungen, aber normalerweise gut genug für meine Bedürfnisse.

var fiveDaysAgo = new Date(new Date() - (1000*60*60*24*5));

0

Für mich haben alle Kombinationen mit dem folgenden Code-Snipplet gut funktioniert. Das Snippet ist für die Angular-2-Implementierung vorgesehen. Wenn Sie Tage hinzufügen müssen, übergeben Sie eine positive Anzahl von Tagen, wenn Sie die negative Anzahl von Tagen subtrahieren müssen

function addSubstractDays(date: Date, numberofDays: number): Date {
let d = new Date(date);
return new Date(
    d.getFullYear(),
    d.getMonth(),
    (d.getDate() + numberofDays)
);
}

0

Ich habe eine gute Laufleistung veraltet. Js:

http://www.datejs.com/

d = new Date();
d.add(-10).days();  // subtract 10 days

Nett!

Website enthält diese Schönheit:

Datejs analysiert nicht nur Strings, sondern schneidet sie sauber in zwei Teile


0

Wenn Sie sowohl eine Anzahl von Tagen subtrahieren als auch Ihr Datum in einem für Menschen lesbaren Format formatieren möchten, sollten Sie ein benutzerdefiniertes DateHelperObjekt erstellen , das ungefähr so ​​aussieht:

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. Subtract 5 days
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), -5));

(siehe auch diese Geige )


0

Siehe folgenden Code, subtrahieren Sie die Tage vom aktuellen Datum. Stellen Sie den Monat außerdem nach dem subtrahierten Datum ein.

var today = new Date();
var substract_no_of_days = 25;

today.setTime(today.getTime() - substract_no_of_days* 24 * 60 * 60 * 1000);
var substracted_date = (today.getMonth()+1) + "/" +today.getDate() + "/" + today.getFullYear();

alert(substracted_date);

-1

Wenn Sie das Datum einstellen, wird das Datum in Millisekunden konvertiert. Sie müssen es also wieder in ein Datum konvertieren:

Diese Methode berücksichtigt auch Neujahrswechsel etc.

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

var date_from = new Date();
var date_to = addDays( new Date(), parseInt(days) );

-1

Sie können Javascript verwenden.

var CurrDate = new Date(); // Current Date
var numberOfDays = 5;
var days = CurrDate.setDate(CurrDate.getDate() + numberOfDays);
alert(days); // It will print 5 days before today

Für PHP

$date =  date('Y-m-d', strtotime("-5 days")); // it shows 5 days before today.
echo $date;

Hoffe es wird dir helfen.


-1

Ich habe in Millisekunden umgerechnet und Tage abgezogen, sonst ändern sich Monat und Jahr nicht und sind logisch

var numberOfDays = 10;//number of days need to deducted or added
var date = "01-01-2018"// date need to change
var dt = new Date(parseInt(date.substring(6), 10),        // Year
              parseInt(date.substring(3,5), 10) - 1, // Month (0-11)
              parseInt(date.substring(0,2), 10));
var new_dt = dt.setMilliseconds(dt.getMilliseconds() - numberOfDays*24*60*60*1000);
new_dt = new Date(new_dt);
var changed_date = new_dt.getDate()+"-"+(new_dt.getMonth()+1)+"-"+new_dt.getFullYear();

Hoffnung hilft


-1

var date = new Date();
var day = date.getDate();
var mnth = date.getMonth() + 1;

var fDate = day + '/' + mnth + '/' + date.getFullYear();
document.write('Today is: ' + fDate);
var subDate = date.setDate(date.getDate() - 1);
var todate = new Date(subDate);
var today = todate.getDate();
var tomnth = todate.getMonth() + 1;
var endDate = today + '/' + tomnth + '/' + todate.getFullYear();
document.write('<br>1 days ago was: ' + endDate );


1
Sie sollten Ihren Code / Ihre Antwort immer kommentieren, da einige Leute möglicherweise nicht verstehen, was Sie tun
Michael

-1

Verwenden der modernen JavaScript-Funktionssyntax

const getDaysPastDate = (daysBefore, date = new Date) => new Date(date - (1000 * 60 * 60 * 24 * daysBefore));

console.log(getDaysPastDate(1)); // yesterday


-1

Versuchen Sie so etwas

dateLimit = (curDate, limit) => {
    offset  = curDate.getDate() + limit
    return new Date( curDate.setDate( offset) )
}

currDate kann ein beliebiges Datum sein

Das Limit kann die Differenz in der Anzahl der Tage sein (positiv für die Zukunft und negativ für die Vergangenheit).


-1

Dies gibt Ihnen die letzten 10 Tage Ergebnis 110% Arbeit Sie werden keine Art von Problem bekommen

var date = new Date();
var day=date.getDate();
var month=date.getMonth() + 1;
var year=date.getFullYear();
var startDate=day+"/"+month+"/"+year;
var dayBeforeNineDays=moment().subtract(10, 'days').format('DD/MM/YYYY');
startDate=dayBeforeNineDays;
var endDate=day+"/"+month+"/"+year;

Sie können die Subtraktionstage entsprechend Ihren Anforderungen ändern


-2
var daysToSubtract = 3;
$.datepicker.formatDate('yy/mm/dd', new Date() - daysToSubtract) ;

-2

var d = new Date();

document.write('Today is: ' + d.toLocaleString());

d.setDate(d.getDate() - 31);

document.write('<br>5 days ago was: ' + d.toLocaleString());

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.