Функция для вычисления дней между 2 указанными датами иногда дает неточный результат - PullRequest
2 голосов
/ 23 сентября 2019

У меня есть дни между функциями, которые должны точно подсчитывать количество дней между двумя датами, вот код:

function DaysBetween(str1, str2) {
  var date1 = str1;
  var date2 = str2;
  date1 = date1.split("/");
  date2 = date2.split("/");
  var oneday = 24 * 60 * 60 * 1e3;
  date1 = new Date(date1[2], date1[0], date1[1]);
  date2 = new Date(date2[2], date2[0], date2[1]);
  var diffDays = Math.round(Math.abs((date1.getTime() - date2.getTime()) / oneday));
  if (diffDays == 0) {
    diffDays = 1;
  }

  console.log(diffDays);
  return diffDays;
}
DaysBetween("9/24/2019","10/1/2019")

иногда это работает нормально, но иногда дает неточное количество дней.

Например, если date1 = 09/24/2019 и date2 = 09/25/2019, возвращается правильное значение.ответ «1» или date1 = 09/24/2019 и date2 = 09/30/2019 возвращает правильный ответ в течение 6 дней, однако, если я введу даты date1 = 09/24/2019 и date2 = 10/01/2019, он возвращает «8 дней», когда должно быть 7. Что дает?

Ответы [ 2 ]

6 голосов
/ 23 сентября 2019

В JavaScript месяцы начинаются с 0, если не указана в качестве строки даты.

Например, new Date(2019,0,1) вернет 1 января 2019 и new Date(2019,1,1) вернет 1 февраля 2019

В то же время new Date("2019/1/1") вернет 1 января 2019

console.log(new Date(2019,0,1).toString())
console.log(new Date(2019,1,1).toString())

В вашем коде он рассчитывает разницу между 24 октября 2019 и 1 ноября 2019 .Октябрь имеет 31 день, следовательно, 8 правильный ответ.Чтобы получить разницу для 24 сентября 2019 и 1 октября 2019 , вам нужно уменьшить значение 1 до значения месяца.

Вам необходимо исправить свой кодна следующий

date1 = new Date(date1[2], parseInt(date1[0])-1, date1[1]);
date2 = new Date(date2[2], parseInt(date2[0])-1, date2[1]);

function DaysBetween(str1, str2) {
  var date1 = str1;
  var date2 = str2;
  date1 = date1.split("/");
  date2 = date2.split("/");
  var oneday = 24 * 60 * 60 * 1e3;
  date1 = new Date(date1[2], parseInt(date1[0]) - 1, date1[1]);
  date2 = new Date(date2[2], parseInt(date2[0]) - 1, date2[1]);
  var diffDays = Math.round(Math.abs((date1.getTime() - date2.getTime()) / oneday));
  if (diffDays == 0) {
    diffDays = 1;
  }

  console.log(diffDays);
  return diffDays;
}
DaysBetween("9/24/2019", "10/1/2019");

И вот предложение.Вам не нужны все эти строки.Это можно легко сделать с помощью следующего кода

function dateDiff(d1,d2){
  return (new Date(d2).getTime() - new Date(d1).getTime())/(1000 * 60 * 60 * 24);
}

, который получит время в метке времени Unix, найдет разницу и затем разделит ее на 1000 * 60 * 60 * 24 , чтобы найти дни.

function dateDiff(d1,d2){
  return (new Date(d2).getTime() - new Date(d1).getTime())/(1000 * 60 * 60 * 24);
}

console.log(dateDiff("2019/9/24","2019/10/1"));
1 голос
/ 23 сентября 2019

Истинный объект Date во многих языках представляет собой числовое представление времени из некоторого значения Epoch.Javascript использует количество миллисекунд с начала эпохи Unix 1 января 1970 года до полуночи.Таким образом, чтобы найти разницу между двумя датами, это может быть простая математика:

Для d1 = '2020-01-01' и d2 = '2021-01-01'

new Date(d2) - new Date(d1)

Что даст вам разницу в миллисекундах между двумя датами.Если вы хотите, вы можете проверить, меньше ли d1 чем d2 или что-либо еще, или вы можете просто установить абсолютное значение, чтобы получить разницу, независимо от того, какое из них больше.Обратите внимание, что здесь не учитывается элемент time.Если вы хотите учесть это, есть еще пара шагов.

Но теперь, когда у нас есть разница в миллисекундах, нам нужно преобразовать ее в дни.

В одном дне 86 400 000 миллисекунд, поэтому мы можем просто разделить нашу стоимость на это, чтобы получить дни.

(new Date(d2) - new Date(d1))/86400000

Но это потенциально даст нам десятичное число.Таким образом, мы должны избавиться от этого.Math снова на помощь.

Math.floor( Math.abs((new Date(d2) - new Date(d1)))/86400000 )

Затем мы превращаем все это в функцию, чтобы мы могли использовать ее снова.

function getDaysBetween(d1,d2){
  return ( Math.floor( Math.abs((new Date(d2) - new Date(d1)))/86400000 ) ) ;
}

Так console.log( getDaysDiff('2020-01-01','2021-01-01') ) ; даст нам 366.Javascript Date объект учитывает Leap Days, но не учитывает Leap Seconds.Если это проблема, вам придется ее учитывать.Также обратите внимание, что если вы заботитесь о датах из разных часовых поясов, вам, возможно, придется учитывать это также.Моя функция выше рассчитывает только разницу дней.Поэтому, если у вас есть две даты из двух часовых поясов (1 января 2019 г. 01:00 и 2 января 2019 г. 01:00), вы можете корректно учесть разницу часовых поясов.

Кроме того, я не проверяю ошибки вПодтвердите, что вы передали функции действительную дату.Если он недействителен, вы получите NaN результат.

function getDaysBetween(d1,d2){
  return ( Math.floor( Math.abs((new Date(d2) - new Date(d1)))/86400000 ) ) ;
}

console.log( getDaysBetween('2020-01-01','2021-01-01') ) ;


d1 = '09/24/2019' ;
d2 = '09/30/2019' ;
d3 = '10/01/2019' ;

console.log(getDaysBetween(d1,d2)); //6
console.log(getDaysBetween(d1,d3)); //7

https://jsfiddle.net/tgy4qr7n/

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

...