Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 计算两个日期之间的天数。意外结果_Javascript_Node.js_Date - Fatal编程技术网

Javascript 计算两个日期之间的天数。意外结果

Javascript 计算两个日期之间的天数。意外结果,javascript,node.js,date,Javascript,Node.js,Date,我正在编写一个函数,计算给定日期从今天算起的天数。(例如,昨天=1,上周=7,今天=0,明天=-1等等) 看起来很简单,我最初使用JavaScript函数编写了以下代码: let historicalDate = new Date(2017,05,17).getTime(); // example date: last week let diff = Math.round((new Date().getTime() - historicalDate) / (24*60*60*1000) );

我正在编写一个函数,计算给定日期从今天算起的天数。(例如,
昨天=1
上周=7
今天=0
明天=-1
等等)

看起来很简单,我最初使用JavaScript函数编写了以下代码:

let historicalDate = new Date(2017,05,17).getTime(); // example date: last week
let diff = Math.round((new Date().getTime() - historicalDate) / (24*60*60*1000) );
在得到一些奇怪的结果后,我整理了代码,但仍然遇到了相同的问题,如下所示:

/**
*返回一个整数,表示自给定日期起的天数
**/
函数getNumDaysFromDate(historicalDate){
const day=24*60*60*1000;//一天中的毫秒数
const now=new Date().getTime();//现在的时间
const-then=historicalDate.getTime();//与比较的时间
返回Math.round((now-then)/day);//查找以毫秒为单位的差异,然后是以天为单位的差异
}
//测试1:上周,应该返回7
let CreationDate 1=新日期(2017年5月17日);
log(“上周:”,getNumDaysFromDate(creationDate1));//失败,打印-23
//测试2:昨天,应该返回1
let CreationDate 2=新日期(2017,05,23);
log(“昨天:,getNumDaysFromDate(CreationDate 2));//失败,打印-29
//Test3:今天,应该返回0
让CreationDate 3=新日期();
console.log(“今天:,getNumDaysFromDate(CreationDate 3));//通过,打印0
//测试4:明天之后,应该返回-2
let CreationDate 4=新日期(2017,05,26);

log(“Future:,getNumDaysFromDate(creationDate4));//失败,打印-32
小心:Javascript日期API完全疯狂(与Java日期API完全相同)


月份从0(一月)开始,一直到11(十二月)。因此
新日期(2017,5,17)
实际上意味着2017年6月17日。

提醒JavaScript中的月份是以零为基础的(一月=0,二月=1,…)。所以如果你需要的话,可能是4(不是5)

/**
*返回一个整数,表示自给定日期起的天数
**/
函数getNumDaysFromDate(historicalDate){
const day=24*60*60*1000;//一天中的毫秒数
const now=new Date().getTime();//现在的时间
const-then=historicalDate.getTime();//与比较的时间
var值=数学轮((现在-那时)/天);
如果(值==0){
返回0
}
否则{
返回值+30;
}//以毫秒为单位查找差异,然后以天为单位查找差异
}
//测试1:上周,应该返回7
let CreationDate 1=新日期(2017,04,17);//2017年5月17日
log(“上周:”,getNumDaysFromDate(creationDate1));//失败,打印-23
//测试2:昨天,应该返回1
let CreationDate 2=新日期(2017,04,23);//2017年5月23日
log(“昨天:,getNumDaysFromDate(CreationDate 2));//失败,打印-29
//Test3:今天,应该返回0
让CreationDate 3=新日期();
console.log(“今天:,getNumDaysFromDate(CreationDate 3));//通过,打印0
//测试4:明天之后,应该返回-2
let CreationDate 4=新日期(2017,04,26);//2017年5月26日

log(“Future:,getNumDaysFromDate(creationDate4));//失败,打印-32
使用momentjs并避免头痛。我不会因为这么简单的事情而接受失败!但是,是的,这将是一个解决方案。我想考虑避免使用一个库,如果我可以在1行或2行中使用它。请检查这个问题:当用指定的构造函数初始化一个新的日期时,月份编号从一月开始的1,所以5是5。但是,使用空构造函数
new Date()
1月为0,5月为4。比较新日期(2017,05,17)。getMonth()和新日期()。getMonth()这是正确的答案,前面的答案只是偶然的,因为示例中的日期都在5月。我认为不是,因为它指出了一个问题,但并没有真正回答如何规避它。我已经编辑了我的答案,将这个问题包括在内。@R.McManaman:嗯,我的答案表明这个假设本身是错误的。“新日期(2017年5月17日)”不是5月的日期,而是6月的日期。所以代码本身是正确的,只是输入了错误的数据。@RobG:程序员是人。人类很早就习惯于一年中的第一个月是一月(1==一月)。定义一个违背基本期望的API是愚蠢的。这不仅仅是一个理论问题:正是因为这种疯狂,我看到了无数的bug。不要期望程序员能够处理任何违反直觉的API;相反,设计符合(合理的)预期的API。“与Java日期API完全相同”-使旧的遗留Java日期时间API(现在被类取代)成为日期时间工作的最优秀框架。关于RobG的评论,Java世界多年来一直充斥着一组糟糕的date time类,但成功地用Joda time取代了它,Joda time后来激发了Java.time的灵感。java.time源代码是GPL,可以移植…感谢您的回答,但是代码片段的结果不正确(例如,昨天不是32天前)。我很瘦,因为您使用了@Rishikesh Chandra的解决方案,然后还修改了日期;)