Como conseguir 30 dias antes da data atual?

95

Eu tenho uma caixa de entrada de calendário inicial e uma caixa de entrada de calendário final. Queremos que os padrões iniciem a caixa de entrada do calendário 30 dias antes da data atual e a caixa de entrada do calendário final seja a data atual. Aqui está minha data 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();

A data de término seria algo como var enddate = startdate - 30;Obviamente, isso não funcionará.

Portanto, se a data atual for 30 de dezembro de 2011, gostaria que a data de início fosse 1º de dezembro de 2011.

EDIT: Minha pergunta foi respondida ... mais ou menos. Date.today();e Date.today().add(-30);funciona, mas preciso da data no formato de January 13, 2012. Não Fri Jan 13 2012 10:48:56 GMT -055 (EST). Qualquer ajuda?

MAIS EDITAR: como este artigo foi escrito, 2018. Basta usar Moment.js . Este é o melhor.

Jesse Atkinson
fonte
stackoverflow.com/questions/563406/… Acho que pode ajudar.
Tim Withers

Respostas:

147

Tente usar a excelente biblioteca de datas JavaScript Datejs (o original não é mais mantido, então você pode estar interessado nesta bifurcação mantida ativamente ):

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

[Editar]

Veja também a excelente biblioteca de datas JavaScript Moment.js :

moment().subtract(30, 'days'); // or...
moment().add(-30, 'days');
matemática
fonte
3
Eu estava lutando para obter as datas de início e término 30 dias antes e depois de hoje em UTC sem hora. Funcionou:moment( moment().subtract(30, 'days') ).format("YYYY-MM-DD")
Dylan Valade
3
Usei a moment()abordagem e acrescentei o toDate()método para recuperar o objeto de data JavaScript. Obrigado!
Brylie Christopher Oxley
4
Por que você precisa usar uma biblioteca para isso? Isso parece loucura.
Harry
1
você pode recomendar uma biblioteca para console.log?
Andre Elrico
149

Tente isto

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

Conforme observado por @Neel, este método retorna no formato Javascript Timestamp. Para convertê-lo de volta ao objeto de data, você precisa passar o acima para um novo objeto de Data; new Date(priorDate).

Rory McCrossan
fonte
14
Sem usar uma biblioteca externa, eu gosto mais dessa solução. Obrigado.
Gowiem
16
Observe que este método retorna no formato Javascript Timestamp. Para convertê-lo de volta ao objeto de data, você precisa passar o new Date(priorDate)
texto
1
Às vezes, você só quer vanilla js sem uma biblioteca! Obrigado :)
Andrew McOlash
Recebo setDate () não é uma função
chovy
1
@chovy, a única maneira de imaginar que você está recebendo esse erro é porque não está chamando setDate()um Dateobjeto. Porém, é impossível diagnosticar sem ver seu código.
Rory McCrossan
85

Esta é uma solução feia para você:

var date = new Date(new Date().setDate(new Date().getDate() - 30));
Nahn
fonte
23
Hilariamente, esta é a melhor solução.
Mark Rogers
7
Concordo - esta é a melhor solução. Esta é exatamente a solução da resposta de Rory McCrossan - mas concisa e completa (nenhuma biblioteca externa necessária).
Dan Nissenbaum
6
@MarkRogers "Hilariously" é a palavra certa. As datas do JavaScript são realmente absurdas.
JosephStyons
37
startDate = new Date(today.getTime() - 30*24*60*60*1000);

O .getTime()método retorna um carimbo de data / hora JS padrão (milissegundos desde 01/01/1970) no qual você pode usar operações matemáticas regulares, que podem ser alimentadas de volta para o objeto Date diretamente.

Marc B
fonte
8

Obtenha os próximos 30 dias a partir de hoje

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

Obtenha o formulário dos últimos 30 dias hoje

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

WasiF
fonte
5

Javascript pode lidar com isso sem quaisquer bibliotecas externas.

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

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

Freddy
fonte
2

Fácil.(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();
Manish Kumar
fonte
1

Eu uso date.js . Ele lida com isso facilmente e cuida de todas as maldades do ano bissexto.

Diodeus - James MacFarlane
fonte
1

Eu vou preferir o momento js

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

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

Esta é uma versão ES6

let date = new Date()
let newDate = new Date(date.setDate(date.getDate()-30))
console.log(newDate.getMonth()+1 + '/' + newDate.getDate() + '/' + newDate.getFullYear() )
Lawrence Edmondson
fonte
Como isso é diferente de qualquer uma das outras respostas, como esta ? Além disso, não há nada aqui que não pudesse ser feito no ES5 ... ou mesmo no ES3.
Macaco herege
0

Você pode fazer isso simplesmente por meio de 1 linha de código usando momento no Node JS. :)

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

Não quer o formato UTC, FÁCIL: P

    let lastOneMonthDate = moment().subtract(30,"days").toISOString()
Shagun Pruthi
fonte
0

Se você não estiver inclinado a momentos, você pode usar isto:

let x = new Date()

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

Basicamente, ele obtém a data atual (valor numérico da data do mês atual) e, em seguida, define o valor. Em seguida, ele é convertido para o formato ISO, a partir do qual eu divido a data numérica pura (ou seja, 23/09/2019)

Espero que ajude alguém.

Usman Khalil
fonte
0

let today = new Date()

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

last30Days estará em Date Object

Kevin chandra
fonte