Tage, Monate, Jahre von einem Datum in JavaScript subtrahieren

Lesezeit: 7 Minuten

Benutzer-Avatar
Benutzer3378165

Kennt jemand eine einfache Möglichkeit, ein Datum (z. B. Heute) zu nehmen und X Tage, X Monate und X Jahre zurückzugehen?

Ich habe das versucht:

var date = new Date();
$("#searchDateFrom").val((date.getMonth() -1 ) + "https://stackoverflow.com/" + (date.getDate() - 6) + "https://stackoverflow.com/" + (date.getFullYear() - 1));

Aber ich habe ein negatives Datum bekommen, zum Beispiel war die Ausgabe heute:

3/-3/2015

Irgendwelche Ratschläge?

Vielen Dank.

  • date.get.... wird a zurückgeben Number und wenn Sie eine Zahl von einer anderen subtrahieren numberder Wert kann negativ sein (wenn der linke Wert kleiner ist). Ich würde Ihnen vorschlagen, ihn zu verwenden DateObj.set... Methoden und rufen Sie dann die jeweiligen Werte ab …

    – Kunstseide

    3. Mai 2016 um 11:23 Uhr


Sie reduzieren einfach die Werte von einer Zahl. Wenn Sie also 6 von 3 (Datum) subtrahieren, wird nur -3 zurückgegeben.

Sie müssen die Zeiteinheit im Datumsobjekt einzeln hinzufügen/entfernen

var date = new Date();
date.setDate( date.getDate() - 6 );
date.setFullYear( date.getFullYear() - 1 );
$("#searchDateFrom").val((date.getMonth() ) + "https://stackoverflow.com/" + (date.getDate()) + "https://stackoverflow.com/" + (date.getFullYear()));

  • getMonth() ist nullbasiert. Das heißt, es wird der falsche Monat angezeigt. Beispiel: 10 ist November.

    – Toni

    16. August 2017 um 20:51 Uhr

  • sagen wir einfach: getMonth() ist indexbasiert.

    – GottZ

    21. Mai 2020 um 13:55 Uhr

  • Aber getMinutes() zum Beispiel ist nicht indexbasiert. Es ist also fair zu sagen, dass die Inkonsistenz falsch ist, wie @Tony es ausdrückt.

    – Mikemaccana

    11. Mai um 15:21 Uhr

Wie andere gesagt haben, subtrahieren Sie von den numerischen Werten, die von Methoden wie zurückgegeben werden date.getDate(), müssen Sie diese Werte für Ihre Datumsvariable zurücksetzen. Ich habe unten eine Methode erstellt, die dies für Sie erledigt. Es erstellt ein Datum mit new Date() die mit dem aktuellen Datum initialisiert wird und dann Datum, Monat und Jahr gemäß den übergebenen Werten einstellt. Wenn Sie beispielsweise 6 Tage zurückgehen möchten, geben Sie so -6 ein var newdate = createDate(-6,0,0). Wenn Sie keinen Wert festlegen möchten, übergeben Sie eine Null (oder Sie können Standardwerte festlegen). Die Methode gibt das neue Datum für Sie zurück (getestet in Chrome und Firefox).

function createDate(days, months, years) {
        var date = new Date(); 
        date.setDate(date.getDate() + days);
        date.setMonth(date.getMonth() + months);
        date.setFullYear(date.getFullYear() + years);
        return date;    
    }

Benutzer-Avatar
FvB

Aktualisierung 2021:

MomentJS wurde durch LuxonJS ersetzt/verbessert, eine viel aktuellere und neuere Version. Sie finden es hier: https://moment.github.io/luxon/#/

Ich lasse den alten Beitrag erstmal stehen, da er anderen doch helfen könnte.

Alter Beitrag:

Ich würde empfehlen, die MomentJS-Bibliotheken zu verwenden. Sie machen alle Interaktionen mit Dates viel einfacher.

Wenn Sie Moment verwenden, wäre Ihr Code so einfach:

var today = moment();
var nextMonth = today.add('month', 1);
// note that both variables `today` and `nextMonth` refer to 
// the next month at this point, because `add` mutates in-place

Sie finden MomentJS hier: http://momentjs.com/

AKTUALISIEREN:

In JavaScript gibt die Funktion Date.getDate() den aktuellen Tag des Monats von 1-31 zurück. Sie subtrahieren 6 von dieser Zahl, und es ist derzeit der 3. des Monats. Dies bringt den Wert auf -3.

  • @Fvb Danke, ich habe den Leitfaden gelesen und es ist eine ausgezeichnete Bibliothek, danke für die Idee, sie zu verwenden.

    – Benutzer3378165

    3. Mai 2016 um 12:14 Uhr

  • Denken Sie daran, dass moment.js Ihrer App etwa 16.000 hinzufügt. Normalerweise keine große Sache. Aber wenn die Leistung entscheidend ist, ist das Festhalten an einfachen alten js für eine so kleine Berechnung billiger.

    – Shanemgrey

    29. Juli 2017 um 13:27 Uhr

  • Die aktuelle Version von moment (2.18.2 zum Zeitpunkt dieses Schreibens) warnt vor dieser Funktion. add/subtract(‘period’, number) ist veraltet und schlägt vor, stattdessen add/subtract(number, ‘period’) zu verwenden.

    – Jamie M

    19. September 2017 um 18:40 Uhr

  • Für alle, die hier im Jahr 2021 suchen, ist moment.js nicht mehr die beste Bibliothek. luxon.js ist sein Nachfolger, und es gibt viele andere moderne Alternativen.

    – Elliotregan

    15. November 2021 um 16:50 Uhr

Benutzer-Avatar
N8allan

Dies ist eine reine Funktion, die ein übergebenes Startdatum annimmt und auf Phils Antwort aufbaut:

function deltaDate(input, days, months, years) {
    return new Date(
      input.getFullYear() + years, 
      input.getMonth() + months, 
      Math.min(
        input.getDate() + days,
        new Date(input.getFullYear() + years, input.getMonth() + months + 1, 0).getDate()
      )
    );
}

zB schreibt das Datum vor einem Monat in das Konsolenprotokoll:

console.log(deltaDate(new Date(), 0, -1, 0));

z. B. subtrahiert einen Monat vom 30. März 2020:

console.log(deltaDate(new Date(2020, 2, 30), 0, -1, 0)); // Feb 29, 2020

Beachten Sie, dass dies auch funktioniert, wenn Sie das Ende des Monats oder Jahres überschreiten.

Aktualisieren: Wie das obige Beispiel zeigt, wurde dies aktualisiert, um Abweichungen in der Anzahl der Tage in einem Monat zu behandeln.

Benutzer-Avatar
Stefano Borzi

Ich habe eine ähnliche Funktion wie die implementiert momentjs Methode subtrahieren.

– Wenn Sie Javascript verwenden

function addDate(dt, amount, dateType) {
  switch (dateType) {
    case 'days':
      return dt.setDate(dt.getDate() + amount) && dt;
    case 'weeks':
      return dt.setDate(dt.getDate() + (7 * amount)) && dt;
    case 'months':
      return dt.setMonth(dt.getMonth() + amount) && dt;
    case 'years':
      return dt.setFullYear( dt.getFullYear() + amount) && dt;
  }
}

Beispiel:

let dt = new Date();
dt = addDate(dt, -1, 'months');// use -1 to subtract 

– Wenn Sie Typoskript verwenden:

export enum dateAmountType {
  DAYS,
  WEEKS,
  MONTHS,
  YEARS,
}

export function addDate(dt: Date, amount: number, dateType: dateAmountType): Date {
  switch (dateType) {
    case dateAmountType.DAYS:
      return dt.setDate(dt.getDate() + amount) && dt;
    case dateAmountType.WEEKS:
      return dt.setDate(dt.getDate() + (7 * amount)) && dt;
    case dateAmountType.MONTHS:
      return dt.setMonth(dt.getMonth() + amount) && dt;
    case dateAmountType.YEARS:
      return dt.setFullYear( dt.getFullYear() + amount) && dt;
  }
}

Beispiel:

let dt = new Date();
dt = addDate(dt, -1, 'months'); // use -1 to subtract

Optional (Unit-Tests)

Ich habe auch einige Unit-Tests für diese Funktion mit gemacht Jasmin:

  it('addDate() should works properly', () => {
    for (const test of [
      { amount: 1,  dateType: dateAmountType.DAYS,   expect: '2020-04-13'},
      { amount: -1, dateType: dateAmountType.DAYS,   expect: '2020-04-11'},
      { amount: 1,  dateType: dateAmountType.WEEKS,  expect: '2020-04-19'},
      { amount: -1, dateType: dateAmountType.WEEKS,  expect: '2020-04-05'},
      { amount: 1,  dateType: dateAmountType.MONTHS, expect: '2020-05-12'},
      { amount: -1, dateType: dateAmountType.MONTHS, expect: '2020-03-12'},
      { amount: 1,  dateType: dateAmountType.YEARS,  expect: '2021-04-12'},
      { amount: -1, dateType: dateAmountType.YEARS,  expect: '2019-04-12'},
    ]) {
      expect(formatDate(addDate(new Date('2020-04-12'), test.amount, test.dateType))).toBe(test.expect);
    }

  });

Um diesen Test zu verwenden, benötigen Sie diese Funktion:

// get format date as 'YYYY-MM-DD'
export function formatDate(date: Date): string {
  const d     = new Date(date);
  let month="" + (d.getMonth() + 1);
  let day     = '' + d.getDate();
  const year  = d.getFullYear();

  if (month.length < 2)  {
    month="0" + month;
  }
  if (day.length < 2) {
    day = '0' + day;
  }

  return [year, month, day].join('-');
}

  • kürzeres formatDate “hack”: function formatDate(date = new Date()) { return date.toLocaleString(‘sv’).substring(0,10); }

    – loxx

    18. März 2021 um 10:26 Uhr


  • Bei formatDate müssen Sie sich nicht verrückt machen toLocaleString. Verwenden toISOString.substring(0,10).

    – Jonas Äppelgran

    15. Juni 2021 um 8:03 Uhr

  • Wichtiger Hinweis: addDate(new Date('2021-07-31'), -3, 'months') gibt 2021-05-01 an, wenn es 2021-04-30 sein sollte.

    – Jonas Äppelgran

    15. Juni 2021 um 8:13 Uhr


Benutzer-Avatar
Flimmer

Verwenden Sie die moment.js Bibliothek für Zeit- und Datumsverwaltung.

import moment = require('moment');

const now = moment();

now.subtract(7, 'seconds'); // 7 seconds ago
now.subtract(7, 'days');    // 7 days and 7 seconds ago
now.subtract(7, 'months');  // 7 months, 7 days and 7 seconds ago
now.subtract(7, 'years');   // 7 years, 7 months, 7 days and 7 seconds ago
// because `now` has been mutated, it no longer represents the current time

  • kürzeres formatDate “hack”: function formatDate(date = new Date()) { return date.toLocaleString(‘sv’).substring(0,10); }

    – loxx

    18. März 2021 um 10:26 Uhr


  • Bei formatDate müssen Sie sich nicht verrückt machen toLocaleString. Verwenden toISOString.substring(0,10).

    – Jonas Äppelgran

    15. Juni 2021 um 8:03 Uhr

  • Wichtiger Hinweis: addDate(new Date('2021-07-31'), -3, 'months') gibt 2021-05-01 an, wenn es 2021-04-30 sein sollte.

    – Jonas Äppelgran

    15. Juni 2021 um 8:13 Uhr


Benutzer-Avatar
Vinayak Thatte

Ich habe eine einfachere Antwort, die tagelang perfekt funktioniert; für Monate sind es +-2 Tage:

let today=new Date();
const days_to_subtract=30;
let new_date= new Date(today.valueOf()-(days_to_subtract*24*60*60*1000));

Sie haben die Idee – für Monate mit 30 multiplizieren; aber das wird +-2 Tage sein.

1227980cookie-checkTage, Monate, Jahre von einem Datum in JavaScript subtrahieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy