Calcular a data ontem em JavaScript

279

Como posso calcular ontem como uma data em JavaScript?

Ómega
fonte

Respostas:

458
var date = new Date();

date ; //# => Fri Apr 01 2011 11:14:50 GMT+0200 (CEST)

date.setDate(date.getDate() - 1);

date ; //# => Thu Mar 31 2011 11:14:50 GMT+0200 (CEST)
James Kyburz
fonte
12
Agradável. À primeira vista, pode parecer que isso falharia ao getDateretornar o dia do mês (por exemplo: 1 - 31), mas na verdade setDate(0)define a data para o último dia do mês anterior. Isso funciona em todos os navegadores?
de Drew Noakes
1
Não foi possível verificar "todos" os navegadores, mas funcionou em tudo o que eu testei camo.githubusercontent.com/…
James Kyburz
1
@Zargold Não entendo o que você quer dizer. node --version v9.4.0 const const date = new Date () undefined> date.toISOString () '2018-02-10T16: 26: 30.821Z'> date.setDate (date.getDate () - 1) 1518193590821> date .toISOString () '2018-02-09T16: 26: 30.821Z'
James Kyburz
Hmm, sim, apenas testei diretamente e você está certo, não sabe como meu caso de uso era diferente e, desde então, foi completamente refatorado. Então não poderei ver.
Zargold 11/11
91

Não é muito eficiente, mas como oneliner:

var yesterday = new Date(new Date().setDate(new Date().getDate()-1));

O exposto acima cria três Dateobjetos desnecessariamente desnecessários. Isso pode ser reduzido a uma única instanciação com:

var yesterday = (function(){this.setDate(this.getDate()-1); return this})
                  .call(new Date)

Ou, se você preferir:

var yesterday = (function(d){ d.setDate(d.getDate()-1); return d})(new Date)

Ou, se você preferir o ES6 com a função de seta:

let yesterday = ( d => new Date(d.setDate(d.getDate()-1)) )(new Date);
KooiInc
fonte
6
Eu preferiria evitar mexer com o escopo:var yesterday = (function(d){ d.setDate(d.getDate()-1); return d})(new Date)
Roy Tinker
4
Se você precisar de uma linha, use algo como novo Date (Date.now () - 24 * 60 * 60 * 1000); isso tem o benefício de criar apenas um objeto Date. Mas, honestamente, quem quer que esteja mantendo esse código ficará muito mais feliz em ver a versão clara de duas linhas do que faria algo lançando funções (ou milissegundos, nesse caso).
Rob Whelan
66

Tente isto

var d = new Date();
d.setDate(d.getDate() - 1);
ashishjmeshram
fonte
1
Próximo comando d.setHours (19,59); Para definir o horário para 19:59
James Jenkins
60

Surpreendentemente, nenhum ponto de resposta para a solução mais fácil entre navegadores

Para encontrar exatamente a mesma hora ontem:

var yesterday = new Date(Date.now() - 86400000); // that is: 24 * 60 * 60 * 1000

Ou seja, se você quer ficar livre de dependência, caso contrário, eu recomendaria usar http://momentjs.com

Fabiano Soriani
fonte
7
Como isso funciona quando o horário de verão muda? Isso não o levaria à frente / atrás de uma hora?
Adam Tegen 25/10
19

Para generalizar a pergunta e fazer outros cálculos de diferenças, use:

var yesterday = new Date((new Date()).valueOf() - 1000*60*60*24);

isso cria um novo objeto de data com base no valor "now" como um número inteiro que representa a época do unix em milissegundos subtraindo um dia.

Dois dias atrás:

var twoDaysAgo = new Date((new Date()).valueOf() - 1000*60*60*24*2);

Uma hora atrás:

var oneHourAgo = new Date((new Date()).valueOf() - 1000*60*60);
Ami Heines
fonte
Esse parece ser o método mais seguro, pois estamos operando na época unix, expressa em termos de milissegundos. Portanto, a aritmética é mais segura do que fazer algo como getDate () - 1. Eu não tentei getDate () - 1, mas com base na documentação de getDate (), ele retornará 1 se a data de hoje for 1º de qualquer mês. E 1-1 = 0 não é uma data válida. Não tenho certeza de como setDate (0) funcionará.
Kapil Pendse
1
Essa foi minha abordagem, embora você também possa simplificá-la um pouco - tente algo como o novo Date (Date.now () - 24 * 60 * 60 * 1000);
Rob Whelan
setDate (0), btw, seria bom - passaria para o último dia do mês anterior. Mas parece mais arrumado (e mais intuitivo) deixar de fazer a representação em milissegundos aqui, para mim - a única desvantagem é que "o número de milésimos de um dia" não é tão óbvio, portanto pode ser fácil digitar errado esse cálculo.
Rob Whelan
Trabalhar com o tempo unix parece ser a opção mais confiável. Isso deve ser classificado como mais alto.
Paul
Sim, eu gosto mais dessa abordagem. Há menos ambiguidade. Acabei indo com new Date(Date.parse(new Date()) - 86400000). Embora eu goste de Date.now (), então talvez eu tente isso. Isso salvará uma data extra.
coblr
9

Eu uso a biblioteca de momentos , é muito flexível e fácil de usar.

No seu caso:

let yesterday = moment().subtract(1, 'day').toDate();
guyaloni
fonte
2
é melhor você usar em subtractvez deadd
Thomas Ayoub
Funciona bem também! Bom trabalho para o FullCalendar e seu validRange
XenoX 16/10
8
new Date(new Date().setDate(new Date().getDate()-1))
Gopinath Radhakrishnan
fonte
3
Você pode adicionar um pouco de explicação? Blocos de código simples por si só não são tudo o que útil
CertainPerformance
Funciona bem ! Obrigado
XenoX 16/10
7
//Create a date object using the current time
var now = new Date();

//Subtract one day from it
now.setDate(now.getDate()-1);
Billyhomebase
fonte
6

var today = new Date();
var yesterday1 = new Date(new Date().setDate(new Date().getDate() - 1));
var yesterday2 = new Date(Date.now() - 86400000);
var yesterday3 = new Date(Date.now() - 1000*60*60*24);
var yesterday4 = new Date((new Date()).valueOf() - 1000*60*60*24);
console.log("Today: "+today);
console.log("Yesterday: "+yesterday1);
console.log("Yesterday: "+yesterday2);
console.log("Yesterday: "+yesterday3);
console.log("Yesterday: "+yesterday4);

Deepu Reghunath
fonte
5

Isso será produzido ontem às 00:00 com precisão de minutos

var d = new Date();
d.setDate(d.getDate() - 1);
d.setTime(d.getTime()-d.getHours()*3600*1000-d.getMinutes()*60*1000);
Evgeni Makarov
fonte
2
d.setHours(0,0,0,0);

fará o truque

godzillante
fonte
1
Vai? Eu pensei que isso apenas definir suas horas, minutos e segundos para 0, mas na verdade não muda a data?
Jesper Bylund
Eu tive que usar números negativos para chegar ontem: d.setHours(-1,0,0,0). Isso retornará a data de ontem, mas pode não ser a hora que você deseja (23:00:00)
cs_pupil
1

Faça uma tentativa, funciona para mim:

var today = new Date();
var yesterday = new Date(today.setDate(today.getDate() - 1)); `

Isso me deu um objeto de data de volta para ontem

Ken Ye
fonte
1
Como você está usando today.setDate, hoje também será alterado para ontem. É melhor criar a variável ontem e defini-la. var yesterday = new Date(); yesterday.setDate(today.GetDate() - 1)assim você pode usar tanto hoje como ontem
PersyJack
1

Aqui está um liner que é usado para obter a data de ontem no formato AAAA-MM-DD no texto e manipular o deslocamento do fuso horário.

new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('T')[0]

Obviamente pode ser alterado para retornar a data, x dias no tempo. Para incluir tempo etc.

console.log(Date())
console.log(new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('T')[0]); // "2019-11-11"
console.log(new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('.')[0].replace('T',' ')); // "2019-11-11 11:11:11"

// that is: [dates] * 24 * 60 * 60 * 1000 - offsetinmin * 60 * 1000    // this is: [dates] * 24 * 60 * 60 * 1000 - offsetinmin * 60 * 1000

Griffin
fonte
0

Se você deseja obter a data de ontem e formatar essa data em um formato legível por humanos, considere criar um DateHelperobjeto personalizado que se parece com isso:

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 1 day
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), -1));

(veja também este violino )

John Slegers
fonte
0

Você pode usar momentjs; é muito útil que você consiga muitas coisas com esta biblioteca.

Obter data de ontem com o tempo atual moment().subtract(1, 'days').toString()

Obter a data de ontem com o início da data moment().subtract(1, 'days').startOf('day').toString()

Abhishek Kumar Pandey
fonte
0

resolver o problema da data limite (2020, 01, 01) -> 2019, 12, 31

var now = new Date();
return new Date(now.getMonth() - 1 === 0 ? now.getFullYear() - 1 : now.getFullYear(),
                now.getDate() - 1 === 0 ? now.getMonth() - 1: now.getMonth(),
                now.getDate() - 1);
Eric Chan
fonte
-1

"Date.now () - 86400000" não funcionará no dia final do horário de verão (que tem 25 horas naquele dia)

Outra opção é usar o Closure:

var d = new goog.date.Date();
d.add(new goog.date.Interval(0, 0, -1));
user10605953
fonte