Como calcular o número de dias entre duas datas

282

Eu tenho duas datas de entrada tiradas do controle Seletor de datas. Selecionei a data de início 2/2/2012 e a data de término 7/7/2012. Eu escrevi o seguinte código para isso.

Eu deveria obter resultado como 6, mas estou recebendo 5.

function SetDays(invoker) {   
    var start = $find('<%=StartWebDatePicker.ClientID%>').get_value();
    var end = $find('<%=EndWebDatePicker.ClientID%>').get_value();

    var oneDay=1000 * 60 * 60 * 24;
    var difference_ms = Math.abs(end.getTime() - start.getTime())
    var diffValue = Math.round(difference_ms / oneDay);
}

Alguém pode me dizer como posso obter a diferença exata?

Vaibhav Deshmukh
fonte
por que você deveria obter resultado = 6 ??? 07 - 02 = 05 dias ....
André Alçada Padez 03/02/12
1
Mas o intervalo de dias de 2 a 7 é de 2,3,4,5,6,7 = 6 dias.
Supr
Enquanto estiver tomando a diferença, quero considerar a data de início também ...
Vaibhav Deshmukh
17
Bem ... por que não basta adicionar 1 à resposta?
Pointy
O problema (se houver) é funcional, não técnico. Comentário @Pointy é a resposta. É por isso que algumas pessoas perguntam por que estamos no século XXI.
Leandro

Respostas:

666

http://momentjs.com/ ou https://date-fns.org/

Dos documentos do momento:

var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days')   // =1

ou para incluir o início:

a.diff(b, 'days')+1   // =2

É melhor do que mexer com timestamps e fusos horários manualmente.

Dependendo do seu caso de uso específico, você pode

  1. Use a/b.startOf('day')e / ou a/b.endOf('day')para forçar o diff a ser inclusivo ou exclusivo nos "fins" (conforme sugerido por @kotpal nos comentários).
  2. Defina o terceiro argumento truepara obter um diff de ponto flutuante que você pode Math.floor, então , Math.ceilou Math.roundconforme necessário.
  3. Opção 2 também pode ser feito por ficar 'seconds'em vez de 'days'e depois dividindo por 24*60*60.
Supr
fonte
30
moment.js atribuirá valor negativo se a <b. Então, mais cálculo robusto seria: Math.abs(a.diff(b, 'days'))+1
Vinay Sahni
18
Esteja ciente de ignorar a parte do tempo - caso contrário, você obterá resultados diferentes para a mesma data, mas com horários diferentes (como em um controle do selecionador de datas). use moment (someDate) .startOf ('day') para definir explicitamente a parte do horário como 00:00:00 antes de executar um diff (ou qualquer outra operação sensível à parte do tempo do objeto Date / moment)
kotpal
Isso funciona, mas não leva em consideração o componente de tempo. Tentando diferenciar entre os dois pares a seguir: (a = "2017-12-24T00: 00: 00Z" e "b = 2017-12-31T23: 59: 59Z") e (a = "2017-12-24T23: 00 : 00Z "e b =" 2017-12-31T23: 59: 59Z "). return b.diff (a, 'days') <= 7; ambos retornam verdadeiros. Existe uma maneira de incluir o componente de tempo no diff?
Roobie
1
+1 para startOf () e endOf (). Eu uso essa biblioteca há alguns anos e nunca as notei antes. Eu sempre fiz +1.
precisa saber é o seguinte
3
Esteja ciente de que startOfmuda o momento. Se você não quer isso, faça a.clone().startOf('day').diff(b.clone().startOf('day')).
HRJ 01/01
53

Se você estiver usando o moment.js, poderá fazê-lo facilmente.

var start = moment("2018-03-10", "YYYY-MM-DD");
var end = moment("2018-03-15", "YYYY-MM-DD");

//Difference in number of days
moment.duration(start.diff(end)).asDays();

//Difference in number of weeks
moment.duration(start.diff(end)).asWeeks();

Se você deseja encontrar a diferença entre uma determinada data e a data atual em número de dias (ignorando a hora), certifique-se de remover a hora do objeto de momento da data atual, conforme abaixo

moment().startOf('day')

Para encontrar a diferença entre uma determinada data e a data atual em número de dias

var given = moment("2018-03-10", "YYYY-MM-DD");
var current = moment().startOf('day');

//Difference in number of days
moment.duration(given.diff(current)).asDays();
Rakesh Prajapati
fonte
2
asDays () retornou alguns valores com decimais. Eu uso current.diff(given, 'days')para que ele fique arredondado.
22419 Vincent
@ Vincent parece que você está usando isso da maneira errada. este é definitivamente a solução mais limpa, o resultado é direito em comparação com a resposta de @Supr em que um 1está perdido
Nwawel A Iroume
15

Experimentar:

//Difference in days

var diff =  Math.floor(( start - end ) / 86400000);
alert(diff);
Richard
fonte
Eu acho que isso é basicamente certo, mas não é essencialmente o mesmo que está no OP?
Pointy
Por causa da maneira como ele escreveu, eu não percebi, mas sim, basicamente! : P
Richard
5
Eu não gosto de números mágicos .. seria melhor se esse número foi discriminado a uma equação auto-explicativo
vsync
7

Tente usar o moment.js (é muito fácil calcular operações de data em javascript)

firstDate.diff (secondDate, 'dias', false); // true | false para o valor da fração

O resultado fornecerá o número de dias em número inteiro.

Sumit
fonte
aqui está a assinatura: moment (). diff (Momento | String | Número | Data | Matriz, String, Booleano);
Sumit
1

Além disso, você pode usar este código: moment ("yourDateHere", "YYYY-MM-DD"). FromNow (). Isso calculará a diferença entre hoje e a data fornecida.

David
fonte
1

Isso funciona para mim:

const from = '2019-01-01';
const to   = '2019-01-08';

Math.abs(
    moment(from, 'YYYY-MM-DD')
      .startOf('day')
      .diff(moment(to, 'YYYY-MM-DD').startOf('day'), 'days')
  ) + 1
);

Martin Kravec
fonte
1

Eu criei uma função reutilizável rápida no ES6 usando o Moment.js.

const getDaysDiff = (start_date, end_date, date_format = 'YYYY-MM-DD') => {
  const getDateAsArray = (date) => {
    return moment(date.split(/\D+/), date_format);
  }
  return getDateAsArray(end_date).diff(getDateAsArray(start_date), 'days') + 1;
}

console.log(getDaysDiff('2019-10-01', '2019-10-30'));
console.log(getDaysDiff('2019/10/01', '2019/10/30'));
console.log(getDaysDiff('2019.10-01', '2019.10 30'));
console.log(getDaysDiff('2019 10 01', '2019 10 30'));
console.log(getDaysDiff('+++++2019!!/###10/$$01', '2019-10-30'));
console.log(getDaysDiff('2019-10-01-2019', '2019-10-30'));
console.log(getDaysDiff('10-01-2019', '10-30-2019', 'MM-DD-YYYY'));

console.log(getDaysDiff('10-01-2019', '10-30-2019'));
console.log(getDaysDiff('10-01-2019', '2019-10-30', 'MM-DD-YYYY'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.js"></script>

Philippe Makzoume
fonte
-1

MVC eu tenho dois texto de entrada 1: número do dia 2: selecionador de data e hora

 @Html.TextBox("HeaderINVID", null, new { @id = "HeaderINVID", @type = "number", @class = "form-control", autocomplete = "off", placeholder = "Day Count " })

  @Html.TextBox("HeaderINVDT", null, new { id = "HeaderINVDT", @class = "form-control format-picker", autocomplete = "off", placeholder = " Date" })

javascipt

para calcular o número a partir da data de uso

    $("#HeaderINVID").bind("keyup", function (e) {
        var INVID = $("#HeaderINVID").val();
        var date = moment()
            .add(INVID, 'd')
            .toDate(); 
        $("#HeaderINVDT").val(moment(date).format('YYYY-MM-DD')) ;
    })

para calcular o número de dias entre duas datas, use

  $("#HeaderINVDT").bind('change', function (e) {
        var StDT = moment($("#HeaderINVDT").val()).startOf('day');
        var NODT = moment().startOf('day');
        $("#HeaderINVID").val(StDT.diff(NODT, 'days'));
    })

não esqueça de adicionar http://momentjs.com/

Aladein
fonte