Come ottenere 30 giorni prima della data corrente?


95

Ho una casella di input del calendario di inizio e una casella di input del calendario di fine. Vogliamo che i valori predefiniti inizino la casella di input del calendario 30 giorni prima della data corrente e la casella di input del calendario di fine sia la data corrente. Ecco le mie date vars.

var today = new Date(),
    dd    = today.getDate(),
    mm    = today.getMonth(),
    yyyy  = today.getFullYear(),
    month = ["January", "February", "March",
        "April", "May", "June", "July", "August",
        "September", "October" "November", "December"],
    startdate = month[mm] + ", " + yyyy.toString();

La data di fine sarebbe qualcosa del genere var enddate = startdate - 30;Ovviamente non funzionerà.

Quindi, se la data corrente è il 30 dicembre 2011, vorrei che la data di inizio leggesse il 1 ° dicembre 2011.

EDIT: La mia domanda ha avuto risposta ... più o meno. Date.today();e Date.today().add(-30);lavoro, ma ho bisogno della data nel formato January 13, 2012. Non Fri Jan 13 2012 10:48:56 GMT -055 (EST). Qualsiasi aiuto?

ALTRO MODIFICA: Al momento della stesura di questo articolo è il 2018. Usa Moment.js . È il migliore.


Risposte:


149

Prova a utilizzare l'eccellente libreria di date JavaScript di Datejs (l'originale non è più mantenuto, quindi potresti essere interessato a questo fork gestito attivamente ):

Date.today().add(-30).days(); // or...
Date.today().add({days:-30});

[Modificare]

Vedi anche l'eccellente libreria di date JavaScript Moment.js :

moment().subtract(30, 'days'); // or...
moment().add(-30, 'days');

3
Stavo lottando per ottenere le date di inizio e fine 30 giorni prima e dopo oggi in UTC senza l'ora. Ha funzionato:moment( moment().subtract(30, 'days') ).format("YYYY-MM-DD")
Dylan Valade

3
Ho utilizzato l' moment()approccio e aggiunto il toDate()metodo per recuperare l'oggetto data JavaScript. Grazie!
Brylie Christopher Oxley,

4
Perché dovresti usare una libreria per questo? Sembra folle.
Harry

1
puoi consigliare una libreria per console.log?
Andre Elrico

149

Prova questo

var today = new Date()
var priorDate = new Date().setDate(today.getDate()-30)

Come notato da @Neel, questo metodo restituisce in formato Timestamp Javascript. Per riconvertirlo in oggetto data, è necessario passare quanto sopra a un nuovo oggetto Data; new Date(priorDate).


14
Senza utilizzare una libreria esterna mi piace di più questa soluzione. Grazie.
Gowiem

16
Nota che questo metodo restituisce in formato Javascript Timestamp. Per riconvertirlo all'oggetto della data, è necessario passare quanto sopra anew Date(priorDate)
Neel

1
A volte vuoi solo js vanilla senza una libreria! Grazie :)
Andrew McOlash

Ottengo setDate () non è una funzione
chovy

1
@chovy, l'unico modo in cui posso immaginare che stai ricevendo quell'errore è perché non stai chiamando setDate()un Dateoggetto. Tuttavia, è impossibile diagnosticare senza vedere il codice.
Rory McCrossan,

86

Ecco una brutta soluzione per te:

var date = new Date(new Date().setDate(new Date().getDate() - 30));

24
Esilarante, questa è la soluzione migliore.
Mark Rogers

8
D'accordo: questa è la soluzione migliore. Questa è esattamente la soluzione della risposta di Rory McCrossan, ma concisa e completa (non sono necessarie librerie esterne).
Dan Nissenbaum

7
@MarkRogers "Hilariously" è la parola giusta. Le date JavaScript sono davvero assurde.
JosephStyons

Sì, questa è una soluzione semplice e migliore.
Sachini Witharana

37
startDate = new Date(today.getTime() - 30*24*60*60*1000);

Il .getTime()metodo restituisce un timestamp JS standard (millisecondi da Jan 1/1970) su cui è possibile utilizzare normali operazioni matematiche, che possono essere restituite direttamente all'oggetto Date.


8

Ricevi i prossimi 30 giorni da oggi

let now = new Date()
console.log('Today: ' + now.toUTCString())
let next30days = new Date(now.setDate(now.getDate() + 30))
console.log('Next 30th day: ' + next30days.toUTCString())

Ricevi gli ultimi 30 giorni da oggi

let now = new Date()
console.log('Today: ' + now.toUTCString())
let last30days = new Date(now.setDate(now.getDate() - 30))
console.log('Last 30th day: ' + last30days.toUTCString())


5

Javascript può gestirlo senza alcuna libreria esterna.

var today = new Date();
var dateLimit = new Date(new Date().setDate(today.getDate() - 30));

document.write(today + "<br/>" + dateLimit)


2

Facile.(Using Vanilla JS)

let days=30;
this.maxDateTime = new Date(Date.now() - days * 24 * 60 * 60 * 1000);

ISOFormat?

let days=30;
this.maxDateTime = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();


1

Preferirò il momento js

startDate = moment().subtract(30, 'days').format('LL')  // January 29, 2015

endDate = moment().format('LL'); // February 28, 2015

0

Questa è una versione ES6

let date = new Date()
let newDate = new Date(date.setDate(date.getDate()-30))
console.log(newDate.getMonth()+1 + '/' + newDate.getDate() + '/' + newDate.getFullYear() )

In che modo questo è diverso da qualsiasi altra risposta, come questa ? Inoltre, non c'è niente qui che non avrebbe potuto essere fatto in ES5 ... o addirittura ES3.
Scimmia eretica

0

Puoi farlo semplicemente tramite 1 riga di codice utilizzando moment in Node JS. :)

    let lastOneMonthDate = moment().subtract(30,"days").utc().toISOString()

Non voglio il formato UTC, PIÙ FACILE: P

    let lastOneMonthDate = moment().subtract(30,"days").toISOString()

0

Se non sei incline ai momentjs, puoi usare questo:

let x = new Date()

x.toISOString(x.setDate(x.getDate())).slice(0, 10)

Fondamentalmente ottiene la data corrente (valore numerico della data del mese corrente) e quindi imposta il valore. Quindi si converte in formato ISO da cui taglio la data numerica pura (cioè 23/09/2019)

Spero che aiuti qualcuno.


0

let today = new Date()

let last30Days = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 30)

last30Days sarà nell'oggetto data

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.