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.