Sottrai giorni da una data in JavaScript


603

Qualcuno sa di un modo semplice per prendere una data (ad esempio oggi) e tornare indietro di X giorni?

Quindi, per esempio, se voglio calcolare la data 5 giorni prima di oggi.


4
Ho riscontrato problemi utilizzando la risposta accettata. Apparentemente l'utilizzo di valori negativi in ​​setDate () non funziona come previsto. Consulta stackoverflow.com/a/9037132/792287 per un'altra soluzione (migliore?).
vandiedakaf,


Risposte:


962

Prova qualcosa del genere:

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

Si noti che ciò modifica l'oggetto data e restituisce il valore dell'ora della data aggiornata.

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
L'output di questo mi dà una lunga stringa di numeri interi. Hai idea di come formattarlo nel 14/05/2012?
user525146

162
Dato che questo è nella parte superiore di Google, immagino che risponderei al commento sopra: new Date(new Date().setDate(new Date().getDate()-5))- che sarà di 5 giorni fa. Nell'esempio della risposta, passalo a una nuova data per ottenere un oggetto data. Quindi new Date(d)è quello che vuoi.
Jesse,

8
Il problema è che puoi finire con 00 che non è un valore valido per data.
DominicM

24
setDate(-1)imposterà la data all'ultimo giorno del mese
Peter,

5
@ user525146 ha chiesto come formattare il numero, non quale sia il numero. Non è necessario rispondere in modo condiscendente. Per formattare il numero, utilizzare uno dei Data toStringmetodi come toISOString, toDateStringe così via
Bad Request

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

Se stai eseguendo molte manipolazioni della data mal di testa in tutta la tua applicazione web, DateJS renderà la tua vita molto più semplice:

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


23
è un caso limite, ma questo può fallire all'inizio / fine dell'ora legale. non stai sottraendo 5 giorni, ma 5 * 24 ore. il primo giorno dell'ora legale dura solo 23 ore e l'ultima dura 25 ore. di solito non importa, ma è qualcosa da considerare.
Kip

11
@Kip Odio l'ora legale ... e i fusi orari. Dovremmo tutti spostarci al GMT.
cwallenpoole,

6
@cwallenpoole non scoppia la bolla, ma usano l'ora legale anche a Greenwich. Quindi, se vuoi davvero essere in GMT, sei limitato all'Islanda e ad alcuni paesi dell'Africa occidentale.
Kip

1
Il problema con questo metodo è che non funziona con il nuovo anno ecc.
Daniel Williams

4
@danielWilliams Come funziona con un nuovo anno? getTime()e setTime()sono millisecondi dall'epoca. Non dovrebbe importare se il tempo attraversa il confine di un anno.
Mashmagar,

53

Va qualcosa del genere:

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

L'output di questo mi dà una lunga stringa di numeri interi. Hai idea di come formattarlo nel 14/05/2012?
user525146

7
Il valore restituito di d.setDate è in effetti un valore intero. Tuttavia, probabilmente non sei effettivamente interessato al valore di ritorno a questo punto, poiché il valore effettivo di "d" è stato modificato. La tua vera domanda è ora come formattare la tua data, che ora è in "d" e non il valore di ritorno di setDate. (Beh, in realtà è il valore di ritorno, ma non è una data a quel punto e non voglio confonderti - usa solo d, sarà più veloce). Per le date di formattazione, si desidera utilizzare i metodi d.getMonth (), d.getFullYear () e d.getDate (). Vuoi aggiungerne uno a d.getMonth (), poiché Jan è 0.
Chris Nielsen,

2
Come metodo semplice: function getDaysAgo(b){var a=new Date;a.setDate(a.getDate()-b);return a};quindi solovar daysAgo45 = getDaysAgo(45);
SpYk3HH

@MiroKrsjak Naturalmente questo funziona se attraversi la fine / l'inizio del mese. Perché non dovrebbe funzionare?
Chris Nielsen,

23

Ho notato che getDays + X non funziona oltre i limiti di giorno / mese. L'uso di getTime funziona fino a quando la data non è precedente al 1970.

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

3
Ho notato lo stesso. Sono sorpreso di più, oppure mi manca qualcosa?
Sean Glover,

11
Questo non è corretto, il nuovo Date (). SetDate (-1) ti darà l'ultimo giorno del mese precedente.
Zbrunson,

2
Ciò è errato anche attorno al bordo limite dell'inizio / fine dell'ora legale. Il tuo approccio sottrae 7 * 24 ore, supponendo che ogni giorno abbia 24 ore. Il primo giorno dell'ora legale dura solo 23 ore e l'ultimo giorno dura 25 ore. setDate (getDate () - 7) non presenta questo problema.
Kip

1
getTime funziona fuori dal tempo universale. Quindi sottrarrà correttamente 7 giorni all'oggetto Date. Quando lo converti in una stringa nel fuso orario specificato, mostrerà correttamente l'ora per quel fuso.
awjr

Fai attenzione al giorno del cambio orario. Quando cadiamo in autunno, quel giorno ha 25 ore, quindi sottraendo 24 ore da mezzanotte ti atterrerà nello stesso giorno. Ma questa tecnica (sottraendo millisecondi) funzionerà se si completa il giorno dopo ogni operazione alla mezzanotte più vicina. Puoi farlo aggiungendo prima 12 ore, quindi impostando le ore su zero.
Magmatic

18

get moment.js. Tutti i ragazzi carini lo usano. Ha più opzioni di formattazione, ecc. Dove

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

Opzionale! Converti in JS Date obj per rilegatura angolare.

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

Opzionale! Formato

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

passando la data al momento, inizierai a ricevere avvisi. Avviso di deprecazione: il valore fornito non è in un formato RFC2822 o ISO riconosciuto. momento la costruzione ricade su js Date (), che non è affidabile su tutti i browser e le versioni. I formati di data non RFC2822 / ISO sono sconsigliati e verranno rimossi in una versione principale imminente. Per ulteriori informazioni, consultare momentjs.com/guides/#/warnings/js-date .
Passa dal

13

Ho realizzato questo prototipo per Date in modo da poter passare valori negativi per sottrarre giorni e valori positivi per aggiungere giorni.

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

Quindi, per usarlo posso semplicemente scrivere:

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

2
È possibile utilizzare d.setDate(d.getDate() + days)con valori positivi e negativi per giorni rispettivamente per aggiungere e sottrarre giorni. E dovrebbe funzionare sull'istanza (come fanno altri metodi Date), non creare e restituire una copia.
RobG,

13

Alcune delle soluzioni esistenti erano vicine, ma non esattamente quello che volevo. Questa funzione funziona con valori positivi o negativi e gestisce i casi limite.

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

2
viene "riversato" al mese successivo se utilizzo questo metodo per aggiungere 20 giorni al 15 del mese corrente? Non sembra.
Bora,

2
@Bora - sì, incrementa correttamente il mese se necessario. Ad esempio, aggiungendo 20 giorni al 15 agosto: addDays (nuova data (2015, 07, 15), 20) restituirà "Ven 04 set 2015 00:00:00 GMT-0700 (PDT)"
Joel Fillmore

12

Mi piace fare la matematica in millisecondi. Quindi usaDate.now()

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

e se ti piace formattato

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

NOTA: Date.now()non funziona nei browser più vecchi (es. IE8 credo). Polyfill qui .

AGGIORNAMENTO Giugno 2015

@socketpair ha sottolineato la mia sciattezza. Come dice "Un giorno all'anno hanno 23 ore e circa 25 a causa delle regole del fuso orario".

Per estenderlo, la risposta sopra avrà imprecisioni di risparmio di luce nel caso in cui si desidera calcolare il giorno LOCALE 5 giorni fa in un fuso orario con le modifiche di luce diurna e tu

  • supponiamo (erroneamente) che Date.now()ti dia il LOCAL attuale ora o, o
  • uso .toString()che restituisce la data locale e pertanto non è compatibile con la Date.now()data di base in UTC.

Tuttavia, funziona se stai facendo i tuoi calcoli tutti in UTC, ad es

A. Desideri la data UTC 5 giorni fa da NOW (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. Si inizia con una data di base UTC diversa da "now", utilizzando Date.UTC()

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

3
Questo non è preciso Qualche giorno dell'anno hanno 23 ore e circa 25 a causa delle regole del fuso orario.
socketpair,

Mi preoccuperei delle condizioni di errore quando ci sono secondi bisestili ... quindi forse non va bene per il codice critico.
robocat,

12

Trovo un problema con il metodo getDate () / setDate () è che trasforma troppo facilmente tutto in millisecondi e la sintassi a volte è difficile da seguire per me.

Invece mi piace lavorare sul fatto che 1 giorno = 86.400.000 millisecondi.

Quindi, per la tua domanda particolare:

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

Funziona come un fascino.

Uso sempre questo metodo per fare calcoli a rotazione di 30/60/365 giorni.

Puoi facilmente estrapolarlo per creare unità di tempo per mesi, anni, ecc.


11

dividere la data in parti, quindi restituire una nuova data con i valori modificati

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

Ricorda che i mesi sono a base zero, ma i giorni no. ovvero nuova data (2009, 1, 1) == 01 febbraio 2009, nuova data (2009, 1, 0) == 31 gennaio 2009;


2
Cosa succede se aggiungi ad esempio 50 giorni a una data in questo modo? Imposta la data al 68 agosto 2009? O sei sicuro che questo si adatti sempre correttamente al mese e / o all'anno appropriati?
Jesper,

Usato per aggiungere addDays, addMonths e addYears a Date.prototype. Bello e semplice.
Scott Isaacs,

1
Questa dovrebbe essere la risposta corretta: funziona anche l'ultimo giorno dell'anno in cui la risposta accettata non riesce.
Kris,

Non funziona per date con anni da 1 a 99. ;-) Molto meglio usare i metodi get * e set * .
RobG,

8

Senza usare la seconda variabile, puoi sostituire 7 per con i tuoi back x giorni:

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

Ho creato una funzione per la manipolazione della data. puoi aggiungere o sottrarre qualsiasi numero di giorni, ore, minuti.

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

Ora chiama questa funzione passando i parametri. Ad esempio, ecco una chiamata di funzione per ottenere la data prima di 3 giorni da oggi.

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

2

Usa 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

Le risposte migliori hanno portato a un bug nel mio codice in cui il primo del mese avrebbe fissato una data futura nel mese corrente. Ecco cosa ho fatto

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

Mi piace quanto segue perché è una riga. Non perfetto con le modifiche dell'ora legale ma di solito abbastanza buono per le mie esigenze.

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

0

per me tutte le combinazioni hanno funzionato bene con lo snipplet di codice sottostante, lo snippet è per l'implementazione di Angular-2, se è necessario aggiungere giorni, passare un numero positivo di giorni, se è necessario sottrarre passare un numero negativo di giorni

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

0

Ottengo un buon chilometraggio con date.js:

http://www.datejs.com/

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

Bello!

Il sito Web include questa bellezza:

Datejs non solo analizza le stringhe, le divide in due in modo pulito


0

Se vuoi sottrarre un numero di giorni e formattare la data in un formato leggibile, dovresti prendere in considerazione la creazione di un DateHelperoggetto personalizzato che assomigli a questo:

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

(vedi anche questo violino )


0

Vedere il codice seguente, sottrarre i giorni dalla data corrente. Inoltre, impostare il mese in base alla data sottratta.

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

Quando si imposta la data, la data viene convertita in millisecondi, quindi è necessario riconvertirla in una data:

Questo metodo prende in considerazione anche il cambio di Capodanno ecc.

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

Puoi usare Javascript.

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

Per PHP,

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

Spero che ti possa aiutare.


-1

Mi sono convertito in millisecondi e ho dedotto giorni in cui mese e anno non cambieranno e logicamente

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

La speranza aiuta


-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
Dovresti sempre commentare il tuo codice / risposta poiché alcune persone potrebbero non ottenere quello che stai facendo
Michael,

-1

Utilizzo della sintassi della funzione JavaScript moderna

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

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


-1

Prova qualcosa del genere

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

currDate potrebbe essere qualsiasi data

limite potrebbe essere la differenza nel numero di giorni (positivo per il futuro e negativo per il passato)


-1

Questo ti darà un risultato del 10% funzionante negli ultimi 10 giorni e non otterrai alcun tipo di problema

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;

è possibile modificare i giorni di sottrazione in base alle proprie esigenze


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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.