Subtrair dias de uma data em JavaScript

603

Alguém conhece uma maneira fácil de marcar uma data (por exemplo, Hoje) e voltar X dias?

Então, por exemplo, se eu quiser calcular a data 5 dias antes de hoje.

jonhobbs
fonte
4
Encontrei problemas ao usar a resposta aceita. Aparentemente, o uso de valores negativos em setDate () não funciona conforme o esperado. Consulte stackoverflow.com/a/9037132/792287 para obter outra solução (melhor?).
precisa saber é o seguinte
5
Possível duplicata: stackoverflow.com/questions/1187824/…
Anderson Green
Veja github.com/viebig/datetreta
Guilherme Viebig 2/16/16

Respostas:

962

Tente algo como isto:

 var d = new Date();
 d.setDate(d.getDate()-5);

Observe que isso modifica o objeto de data e retorna o valor da hora da data atualizada.

var d = new Date();

document.write('Today is: ' + d.toLocaleString());

d.setDate(d.getDate() - 5);

document.write('<br>5 days ago was: ' + d.toLocaleString());

Stephen Wrighton
fonte
9
A saída disso me dá uma longa sequência de números inteiros. Alguma idéia de como formatá-lo em 14/05/2012?
User525146
162
Dado que isso está no topo do google, acho que responderia ao comentário acima: new Date(new Date().setDate(new Date().getDate()-5))- isso acontecerá 5 dias atrás. No exemplo da resposta, passe-o para uma nova data para obter um objeto de data. Então new Date(d)é o que você quer.
Jesse
8
O problema é que você pode terminar com 00, que não é um valor válido para a data.
DominicM
24
setDate(-1)definirá a data para o último dia do mês
Peter
5
@ user525146 perguntou como formatar o número, não qual é o número. Não há necessidade de respostas condescendentes. Para formatar o número, use um dos Data toStringmétodos como toISOString, toDateString, etc.
Bad Request
83
var dateOffset = (24*60*60*1000) * 5; //5 days
var myDate = new Date();
myDate.setTime(myDate.getTime() - dateOffset);

Se você estiver realizando muita manipulação de data de dor de cabeça em todo o aplicativo da Web, o DateJS facilitará sua vida:

http://simonwillison.net/2007/Dec/3/datejs/

karim79
fonte
23
é um caso extremo, mas isso pode falhar no início / fim do horário de verão. você não está subtraindo 5 dias, mas 5 * 24 horas. o primeiro dia de horário de verão tem apenas 23 horas e o último, 25 horas. geralmente não importa, mas é algo a considerar.
218 Kip
11
@Kip Eu odeio horário de verão ... e fusos horários. Todos devemos mudar para a GMT.
cwallenpoole
6
@cwallenpoole para não estourar sua bolha, mas eles usam o horário de verão, mesmo em Greenwich. Portanto, se você realmente deseja participar do GMT, está restrito à Islândia e a alguns países da África Ocidental.
Kip
1
O problema com este método é que ele não funciona com o ano novo etc.
Daniel Williams
4
@danielWilliams Como isso não funciona com um ano novo? getTime()e setTime()são milissegundos desde a época. Não importa se o tempo ultrapassa o limite de um ano.
Mashmagar 19/02/19
52

É algo como isto:

var d = new Date(); // today!
var x = 5; // go back 5 days!
d.setDate(d.getDate() - x);
Chris Nielsen
fonte
A saída disso me dá uma longa sequência de números inteiros. Alguma idéia de como formatá-lo em 14/05/2012?
User525146
7
O valor de retorno de d.setDate é realmente um valor inteiro. No entanto, você provavelmente não está realmente interessado no valor de retorno neste momento, pois o valor real de "d" foi modificado. Sua verdadeira pergunta agora é como formatar sua data, que agora está em "d" e não é o valor de retorno de setDate. (Bem, na verdade é o valor de retorno, mas não é uma data nesse ponto e não quero confundi-lo - basta usar d, será mais rápido). Para formatar datas, você deseja os métodos d.getMonth (), d.getFullYear () e d.getDate (). Você deseja adicionar um ao d.getMonth (), já que Jan é 0. #
Chris Nielsen
2
Como um método simples: function getDaysAgo(b){var a=new Date;a.setDate(a.getDate()-b);return a};então apenasvar daysAgo45 = getDaysAgo(45);
SpYk3HH
@MiroKrsjak É claro que isso funciona se você cruzar o final / início do mês. Por que não funcionaria?
Chris Nielsen
23

Percebi que o getDays + X não funciona nos limites do dia / mês. O uso do getTime funciona desde que sua data não seja antes de 1970.

var todayDate = new Date(), weekDate = new Date();
weekDate.setTime(todayDate.getTime()-(7*24*3600000));
awjr
fonte
3
Eu notei o mesmo. Estou surpreso por não ter, ou estou perdendo alguma coisa?
Sean Glover
11
Isso está incorreto, o novo Date (). SetDate (-1) fornecerá o último dia do mês anterior.
Zbrunson
2
Isso também está incorreto no caso extremo do início / fim do horário de verão. Sua abordagem está subtraindo 7 * 24 horas, supondo que todos os dias tenham 24 horas. O primeiro dia do horário de verão tem apenas 23 horas e o último dia, 25 horas. setDate (getDate () - 7) não tem esse problema.
Kip
1
O getTime funciona fora do tempo universal. Então, subtrairemos corretamente 7 dias do objeto Date. Quando você o converte em uma sequência no fuso horário especificado, ele mostra corretamente o horário desse fuso horário.
awjr
Tenha cuidado no dia de mudança de horário. Quando caímos no outono, esse dia tem 25 horas; portanto, subtrair 24 horas da meia-noite o levará ao mesmo dia. Mas essa técnica (subtraindo milissegundos) funcionará se você terminar o dia após cada operação até a meia-noite mais próxima. Você pode fazer isso adicionando 12 horas primeiro e depois definindo as horas como zero.
Magmatic
18

obtenha moment.js. Todas as crianças legais usam. Possui mais opções de formatação, etc.

var n = 5;
var dateMnsFive = moment(<your date>).subtract(n , 'day');

Opcional! Converter em JS Date obj para ligação angular.

var date = new Date(dateMnsFive.toISOString());

Opcional! Formato

var date = dateMnsFive.format("YYYY-MM-DD");
Kentonbmax
fonte
passando a data para o momento, você começará a receber avisos. Aviso de descontinuação: o valor fornecido não está no formato RFC2822 ou ISO reconhecido. A construção do momento volta para js Date (), que não é confiável em todos os navegadores e versões. Os formatos de data não RFC2822 / ISO são desencorajados e serão removidos em uma próxima versão principal. Consulte momentjs.com/guides/#/warnings/js-date para obter mais informações.
Comute
13

Eu criei esse protótipo para Date para poder passar valores negativos para subtrair dias e valores positivos para adicionar dias.

if(!Date.prototype.adjustDate){
    Date.prototype.adjustDate = function(days){
        var date;

        days = days || 0;

        if(days === 0){
            date = new Date( this.getTime() );
        } else if(days > 0) {
            date = new Date( this.getTime() );

            date.setDate(date.getDate() + days);
        } else {
            date = new Date(
                this.getFullYear(),
                this.getMonth(),
                this.getDate() - Math.abs(days),
                this.getHours(),
                this.getMinutes(),
                this.getSeconds(),
                this.getMilliseconds()
            );
        }

        this.setTime(date.getTime());

        return this;
    };
}

Então, para usá-lo, basta escrever:

var date_subtract = new Date().adjustDate(-4),
    date_add = new Date().adjustDate(4);
Rob Dawley
fonte
2
Você pode usar d.setDate(d.getDate() + days)com valores positivos e negativos por dias para adicionar e subtrair dias, respectivamente. E deve funcionar na instância (como outros métodos Date), não criar e retornar uma cópia.
RobG 26/09
13

Algumas das soluções existentes estavam próximas, mas não exatamente o que eu queria. Esta função trabalha com valores positivos ou negativos e lida com casos de limite.

function addDays(date, days) {
    return new Date(
        date.getFullYear(),
        date.getMonth(),
        date.getDate() + days,
        date.getHours(),
        date.getMinutes(),
        date.getSeconds(),
        date.getMilliseconds()
    );
}
Joel Fillmore
fonte
2
ele "transborda" para o próximo mês se eu usar esse método para adicionar 20 dias a 15 do mês atual? Parece que não.
Bora
2
@Bora - sim, incrementa corretamente o mês, se necessário. Por exemplo, adicionando 20 dias a 15 de agosto: addDays (new Date (2015, 07, 15), 20) retornará "Sex Sep 04 2015 00:00:00 GMT-0700 (PDT)"
Joel Fillmore
12

Eu gosto de fazer as contas em milissegundos. Então useDate.now()

var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds

e se você gosta formatado

new Date(newDate).toString(); // or .toUTCString or .toISOString ...

NOTA: Date.now()não funciona em navegadores mais antigos (por exemplo, IE8, eu acho). Polyfill aqui .

ATUALIZAÇÃO junho 2015

@socketpair apontou minha negligência. Como ele / ela diz: "Algum dia no ano tem 23 horas e 25 devido a regras de fuso horário".

Para expandir isso, a resposta acima terá imprecisões no horário de verão, no caso em que você deseja calcular o dia LOCAL 5 dias atrás em um fuso horário com alterações no horário de verão e você

  • suponha (incorretamente) que Date.now()lhe dê o LOCAL atual agora, ou
  • use .toString()que retorna a data local e, portanto, é incompatível com a Date.now()data base no UTC.

No entanto, funciona se você estiver fazendo todas as contas no UTC, por exemplo

A. Você deseja a data UTC de 5 dias atrás a partir de NOW (UTC)

var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds UTC
new Date(newDate).toUTCString(); // or .toISOString(), BUT NOT toString

B. Você começa com uma data base UTC diferente de "agora", usando Date.UTC()

newDate = new Date(Date.UTC(2015, 3, 1)).getTime() + -5*24*3600000;
new Date(newDate).toUTCString(); // or .toISOString BUT NOT toString
chique
fonte
3
Isto não é preciso. Algum dia do ano tem 23 horas e 25 devido a regras de fuso horário.
Soquete
Eu me preocuparia com as condições de falha quando houver segundos bissextos ... talvez não seja bom para código crítico.
robocat 23/09/15
12

Acho que um problema com o método getDate () / setDate () é que ele transforma tudo com facilidade em milissegundos e a sintaxe às vezes é difícil de seguir.

Em vez disso, gosto de resolver o fato de que 1 dia = 86.400.000 milissegundos.

Então, para sua pergunta em particular:

today = new Date()
days = 86400000 //number of milliseconds in a day
fiveDaysAgo = new Date(today - (5*days))

Funciona como um encanto.

Eu uso esse método o tempo todo para fazer cálculos contínuos de 30/60/365 dias.

Você pode extrapolar isso facilmente para criar unidades de tempo por meses, anos etc.

Jonathan Bechtel
fonte
11

divida sua data em partes e retorne uma nova data com os valores ajustados

function DateAdd(date, type, amount){
    var y = date.getFullYear(),
        m = date.getMonth(),
        d = date.getDate();
    if(type === 'y'){
        y += amount;
    };
    if(type === 'm'){
        m += amount;
    };
    if(type === 'd'){
        d += amount;
    };
    return new Date(y, m, d);
}

Lembre-se de que os meses são baseados em zero, mas os dias não são. ou seja, nova data (2009, 1, 1) == 01 de fevereiro de 2009, nova data (2009, 1, 0) == 31 de janeiro de 2009;

Joshua
fonte
2
O que acontece se você adicionar, por exemplo, 50 dias a uma data dessa maneira? Será que vai definir a data para 68 de agosto de 2009? Ou você tem certeza de que isso sempre ocorre corretamente no mês e / ou ano apropriados?
Jesper
Usado para adicionar addDays, addMonths e addYears ao Date.prototype. Agradável e simples.
Scott Isaacs
1
Essa deve ser a resposta correta - funciona mesmo no último dia do ano em que a resposta aceita falha.
19415 kris
Não funciona para datas com anos de 1 a 99. ;-) É muito melhor usar apenas os métodos get * e set * .
RobG 26/09
8

Sem usar a segunda variável, você pode substituir 7 por suas costas x dias:

let d=new Date(new Date().getTime() - (7 * 24 * 60 * 60 * 1000))
vaibhavmaster
fonte
5

function addDays (date, daysToAdd) {
  var _24HoursInMilliseconds = 86400000;
  return new Date(date.getTime() + daysToAdd * _24HoursInMilliseconds);
};

var now = new Date();

var yesterday = addDays(now, - 1);

var tomorrow = addDays(now, 1);

Petr Makarov
fonte
2

Eu criei uma função para manipulação de datas. você pode adicionar ou subtrair qualquer número de dias, horas, minutos.

function dateManipulation(date, days, hrs, mins, operator) {
   date = new Date(date);
   if (operator == "-") {
      var durationInMs = (((24 * days) * 60) + (hrs * 60) + mins) * 60000;
      var newDate = new Date(date.getTime() - durationInMs);
   } else {
      var durationInMs = (((24 * days) * 60) + (hrs * 60) + mins) * 60000;
      var newDate = new Date(date.getTime() + durationInMs);
   }
   return newDate;
 }

Agora, chame essa função passando parâmetros. Por exemplo, aqui está uma chamada de função para obter a data antes de três dias a partir de hoje.

var today = new Date();
var newDate = dateManipulation(today, 3, 0, 0, "-");
Malvi Panchal
fonte
2

Use MomentJS .

function getXDaysBeforeDate(referenceDate, x) {
  return moment(referenceDate).subtract(x , 'day').format('MMMM Do YYYY, h:mm:ss a');
}

var yourDate = new Date(); // let's say today
var valueOfX = 7; // let's say 7 days before

console.log(getXDaysBeforeDate(yourDate, valueOfX));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

UtkarshPramodGupta
fonte
1

As principais respostas levaram a um erro no meu código, no qual, no primeiro dia do mês, ele definiria uma data futura no mês atual. Aqui está o que eu fiz,

curDate = new Date(); // Took current date as an example
prvDate = new Date(0); // Date set to epoch 0
prvDate.setUTCMilliseconds((curDate - (5 * 24 * 60 * 60 * 1000))); //Set epoch time
Kishore Avineni
fonte
0

Uma maneira fácil de gerenciar datas é usar o Moment.js

Você pode usar add. Exemplo

var startdate = "20.03.2014";
var new_date = moment(startdate, "DD.MM.YYYY");
new_date.add(5, 'days'); //Add 5 days to start date
alert(new_date);

Documentos http://momentjs.com/docs/#/manipulating/add/

Juan Caicedo
fonte
0

Eu gosto do seguinte, porque é uma linha. Não é perfeito com alterações no horário de verão, mas geralmente é bom o suficiente para minhas necessidades.

var fiveDaysAgo = new Date(new Date() - (1000*60*60*24*5));
ScottE
fonte
0

para mim todas as combinações funcionaram bem com o snipplet de código abaixo, o snippet é para a implementação do Angular-2, se você precisar adicionar dias, passar o número positivo de dias, se precisar subtrair o número negativo de dias

function addSubstractDays(date: Date, numberofDays: number): Date {
let d = new Date(date);
return new Date(
    d.getFullYear(),
    d.getMonth(),
    (d.getDate() + numberofDays)
);
}
pritesh agrawal
fonte
0

Recebo uma boa milhagem fora de date.js:

http://www.datejs.com/

d = new Date();
d.add(-10).days();  // subtract 10 days

Agradável!

O site inclui esta beleza:

O Datejs não apenas analisa as strings, mas as divide em duas

Bret Weinraub
fonte
0

Se você deseja subtrair vários dias e formatar sua data em um formato legível por humanos, considere criar um DateHelperobjeto personalizado parecido com este:

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

(veja também este violino )

John Slegers
fonte
0

Veja o código a seguir, subtraia os dias da data atual. Além disso, defina o mês de acordo com a data subtraída.

var today = new Date();
var substract_no_of_days = 25;

today.setTime(today.getTime() - substract_no_of_days* 24 * 60 * 60 * 1000);
var substracted_date = (today.getMonth()+1) + "/" +today.getDate() + "/" + today.getFullYear();

alert(substracted_date);
Manoj Jha
fonte
-1

Ao definir a data, a data é convertida em milissegundos, portanto, você precisa convertê-la novamente em uma data:

Este método também leva em consideração mudanças de ano novo etc.

function addDays( date, days ) {
    var dateInMs = date.setDate(date.getDate() - days);
    return new Date(dateInMs);
}

var date_from = new Date();
var date_to = addDays( new Date(), parseInt(days) );
Daniel Williams
fonte
-1

Você pode usar Javascript.

var CurrDate = new Date(); // Current Date
var numberOfDays = 5;
var days = CurrDate.setDate(CurrDate.getDate() + numberOfDays);
alert(days); // It will print 5 days before today

Para PHP,

$date =  date('Y-m-d', strtotime("-5 days")); // it shows 5 days before today.
echo $date;

Espero que ajude você.

Fénix
fonte
-1

Eu converti em milissegundos e deduzi dias mais mês e ano não vai mudar e lógico

var numberOfDays = 10;//number of days need to deducted or added
var date = "01-01-2018"// date need to change
var dt = new Date(parseInt(date.substring(6), 10),        // Year
              parseInt(date.substring(3,5), 10) - 1, // Month (0-11)
              parseInt(date.substring(0,2), 10));
var new_dt = dt.setMilliseconds(dt.getMilliseconds() - numberOfDays*24*60*60*1000);
new_dt = new Date(new_dt);
var changed_date = new_dt.getDate()+"-"+(new_dt.getMonth()+1)+"-"+new_dt.getFullYear();

A esperança ajuda

hemanjosko
fonte
-1

var date = new Date();
var day = date.getDate();
var mnth = date.getMonth() + 1;

var fDate = day + '/' + mnth + '/' + date.getFullYear();
document.write('Today is: ' + fDate);
var subDate = date.setDate(date.getDate() - 1);
var todate = new Date(subDate);
var today = todate.getDate();
var tomnth = todate.getMonth() + 1;
var endDate = today + '/' + tomnth + '/' + todate.getFullYear();
document.write('<br>1 days ago was: ' + endDate );

ahmad belal
fonte
1
Você deve sempre comentar o seu código / resposta como algumas pessoas podem não conseguir o que você está fazendo
Michael
-1

Usando sintaxe da função JavaScript moderna

const getDaysPastDate = (daysBefore, date = new Date) => new Date(date - (1000 * 60 * 60 * 24 * daysBefore));

console.log(getDaysPastDate(1)); // yesterday

vdegenne
fonte
-1

Tente algo assim

dateLimit = (curDate, limit) => {
    offset  = curDate.getDate() + limit
    return new Date( curDate.setDate( offset) )
}

currDate pode ser qualquer data

limite pode ser a diferença no número de dias (positivo para o futuro e negativo para o passado)

wahid_abdul
fonte
-1

Isso fornecerá a você os últimos 10 dias, resultando em 110% de trabalho, você não receberá nenhum tipo de problema

var date = new Date();
var day=date.getDate();
var month=date.getMonth() + 1;
var year=date.getFullYear();
var startDate=day+"/"+month+"/"+year;
var dayBeforeNineDays=moment().subtract(10, 'days').format('DD/MM/YYYY');
startDate=dayBeforeNineDays;
var endDate=day+"/"+month+"/"+year;

você pode alterar os dias de subtração de acordo com seus requisitos

Zubair
fonte
-2
var daysToSubtract = 3;
$.datepicker.formatDate('yy/mm/dd', new Date() - daysToSubtract) ;
sirWaltmore III
fonte
-2

var d = new Date();

document.write('Today is: ' + d.toLocaleString());

d.setDate(d.getDate() - 31);

document.write('<br>5 days ago was: ' + d.toLocaleString());

gatlingovind
fonte