计算 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/2019
和 date2 = 09/25/2019
returns 正确答案为“1”,或者 date1 = 09/24/2019
和 date2 = 09/30/2019
returns正确答案为 6 天,但是如果我输入 date1 = 09/24/2019
和 date2 = 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
我有一个 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/2019
和 date2 = 09/25/2019
returns 正确答案为“1”,或者 date1 = 09/24/2019
和 date2 = 09/30/2019
returns正确答案为 6 天,但是如果我输入 date1 = 09/24/2019
和 date2 = 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