计算 2 个给定日期之间天数的函数有时会产生不准确的结果

Function to calculate days between 2 given dates sometimes produce inaccurate result

我有一个 days between 函数应该可以准确计算两个日期之间的天数,这里是代码:

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/2019date2 = 09/25/2019 returns 正确答案为“1”,或者 date1 = 09/24/2019date2 = 09/30/2019 returns正确答案为 6 天,但是如果我输入 date1 = 09/24/2019date2 = 10/01/2019 的日期,它会 returns “8 天”,而它应该是 7 天。什么给出?

在 JavaScript 中,如果未作为日期字符串提供,则月份从 0 开始。

例如,new Date(2019,0,1) 将 return 2019 年 1 月 1 日 new Date(2019,1,1) 将 return 2019 年 2 月 1 日

同时,new Date("2019/1/1")将于return2019年1月1日

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

在您的代码中,它计算 2019 年 10 月 24 日2019 年 11 月 1 日 之间的差异。十月有 31 天,因此 8 是正确答案。要获得 2019 年 9 月 24 日2019 年 10 月 1 日 的差异,您需要将月的值减去 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"));

在许多语言中,真正的 Date 对象是来自某个 Epoch 值的时间的数字表示。 Javascript 使用自 Unix 纪元 1970 年 1 月 1 日午夜以来的毫秒数。所以要找出两个日期之间的差异,可以是简单的数学运算:

对于 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 对象确实考虑了闰日,但没有考虑闰秒。如果这是一个问题,你将不得不考虑它。另请注意,如果您要处理来自不同时区的日期,您可能还必须考虑到这一点。我上面的函数只计算全天差异。因此,如果您有两个来自两个时区的日期(2019 年 1 月 1 日 0100 EST 和 2019 年 1 月 2 日 0100 PST),您可能需要正确考虑时区差异。

此外,我没有进行任何错误检查来验证您是否向函数传递了有效日期。如果无效,您将得到 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