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.


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

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


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

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.


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


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)


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


1

Eu vou preferir o momento js

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

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

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

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

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.


0

let today = new Date()

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

last30Days estará em Date Object

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.