在到期日期和当前日期之间计算,然后以javascript返回剩余天数

在到期日期和当前日期之间计算,然后以javascript返回剩余天数,javascript,date,momentjs,Javascript,Date,Momentjs,您好,我想计算到期日和当前日期之间的剩余天数,但回报似乎不是我预期的 function expiryDate(date_string) { var date = date_string.split("/"); var year = parseInt(date[2]); var day = parseInt(date[1]); var month = parseInt(date[0]); var expiration = new Date(month,day,y

您好,我想计算到期日和当前日期之间的剩余天数,但回报似乎不是我预期的

function expiryDate(date_string) {

    var date = date_string.split("/");
    var year = parseInt(date[2]);
    var day = parseInt(date[1]);
    var month = parseInt(date[0]);

var expiration = new Date(month,day,year);

   var d = new Date();
var curr_day = d.getDate();
var curr_month = d.getMonth()+1;
var curr_year = d.getFullYear();

var current_date = new Date(curr_month, curr_day, curr_year);

return (expiration - current_date) / (1000*60*60*24);
}
例如,如果日期相同,上述代码将返回正确的剩余天数。。当前日期字符串为2018年05月01日,到期日期也相同,它将返回0,但当我将到期日期移动到1天(如2018年05月02日)时,返回的是28天,这是不正确的


如何解决此问题?

对象使用以零为基础的月份,其中一月为0,二月为1,等等。您似乎在一个地方尝试过对此进行补偿,但方式错误

您需要按如下方式修复此行:

var month = parseInt(date[0]) - 1;
var curr_month = d.getMonth(); // No +1
这句话是这样的:

var month = parseInt(date[0]) - 1;
var curr_month = d.getMonth(); // No +1

当然,正如所建议的那样,使用Moment.js也是一个好主意,但我认为您可能想知道如何让自己的代码正常工作。

最初使用times有时需要做很多工作,通常您会投入大量时间,根据需要,可能Moment.js库可能是您的解决方案,特别是isBetween

请点击下面的链接


您可以使用momentjs来区分两个日期

以下是工作代码:

函数过期日期(日期字符串){
var expiration=时刻(日期字符串)。格式(“YYYY-MM-DD”);
var current_date=moment().格式(“YYYY-MM-DD”);
var days=时刻(到期).diff(当前日期,'days');
返程天数;
}
警报(“剩余天数=”+到期日(“2018-05-05”);
控制台日志(“剩余天数=”+到期日(“2018-05-05”)

正如其他人指出的那样,月份是零索引的。此外,由于某些地方实行夏时制,您将时间归零的方法并不总是如预期的那样有效。但将结果四舍五入将消除DST效应

不需要库,您的解析函数和计算可以大大简化,您可以轻松地从以下内容中删除另一行:

/*@param{string}date\u string-m/d/y格式的日期
**@returns从今天到到期{number}天
*/
函数到期日(日期字符串){
var b=日期字符串分割(/\D/);
var到期日=新日期(b[2],--b[0],b[1]);
返回Math.round((到期-新日期().setHours(0,0,0,0))/8.64e7);
}
控制台日志(到期日('8/23/2018');
//或者如果你喜欢模糊的代码
var expires=s=>Math.round((新日期(…(s.split(/\D/).reduce((a,v,i)=>{a[(i+1)%3]=(i==0?v-1:v);返回a},[]))-new Date().setHours(0,0,0))/8.64e7);

控制台日志(过期('8/23/2018')我建议使用类似于库的时刻(参见:)并避免使用时区/闰秒/etc/etc。月份是零索引的,因此
var month=date[0]-1
。不需要parseInt或库。天数的差异只是
Math.round((过期-当前_日期)/8.64e7)
,您就完成了。我收到了一条警告,上面写着弃用警告:提供的值不是公认的RFC2822或ISO格式。moment构造回到js Date(),这在所有浏览器和版本中都不可靠。不鼓励使用非RFC2822/ISO日期格式,并将在即将发布的主要版本中删除。。可以吗?@basaya是的,这就是我在提醒功能旁边的评论中提到的<代码>“MM/DD/YYYY”
不是推荐的日期格式。您应该使用一些其他格式,或者干脆忽略它。@basaya以下是受支持的格式。使用其中任何一个:@basaya例如:只需将格式更改为“yyy-MM-DD”,您将不会看到任何警告。我认为您的答案对我来说是最好的答案。我的项目已采用此日期格式“MM/DD/YYYY”,但string.replace()可以解决此问题。。我会认为你的答案是正确的。。谢谢你的帮助。:-)我更改了代码,尝试了你的建议,但结果与我的问题一样。。如果我的到期日为2018年2月5日,则剩余的退货天数为29天,而不是1天。。。我想知道它是如何工作的,就像你所说的,但我认为瞬间库是最好的方式…谢谢你的回答,但是这个例子的结果或返回值是什么?对不起,这个例子的结果将在几天内,在这个例子中返回1这是我正在寻找的,没有库是最好的答案。谢谢你,先生。您太晚了,无法将您的答案标记为正确答案,但您的答案对我帮助很大。@basaya忘记提到expiryDays函数与正在使用的每个实现都兼容。