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

时间:2018-05-01 03:38:28

标签: 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,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);
}

如果日期相同,上面的代码将返回正确的剩余天数..当前日期字符串 05/01/2018 ,到期时间也相同,它将返回0,但是当我将有效期限移动到1天时,如05/02/2018,则返回28天,这是不正确的。

如何解决此问题?

4 个答案:

答案 0 :(得分:1)

Date对象使用从零开始的月份,其中1月为0,2月为1,等等。您似乎已经尝试在一个地方进行补偿,但方式错误。

您需要像这样修复此行:

var month = parseInt(date[0]) - 1;

这一行是这样的:

var curr_month = d.getMonth(); // No +1

当然,按照建议使用Moment.js也是一个好主意,但我想你可能想知道如何让你自己的代码工作。

答案 1 :(得分:1)

正如其他人所指出的那样,月份是零索引。此外,由于某些地方的夏令时,您将小时归零的方法并不总是按预期工作。但舍入结果将消除DST效应。

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

/* @param {string} date_string - date in m/d/y format
** @returns {number} days between today and expiry
*/
function expiryDays(date_string) {
  var b = date_string.split(/\D/);
  var expiry = new Date(b[2],--b[0],b[1]);
  return Math.round((expiry - new Date().setHours(0,0,0,0)) / 8.64e7);
}

console.log(expiryDays('8/23/2018'));

// Or if you like obfuscated code
var expires = s=>Math.round((new Date(...(s.split(/\D/).reduce((a,v,i) => {a[(i+1)%3] = (i==0? v-1 : v);return a},[]))) - new Date().setHours(0,0,0,0))/8.64e7);

console.log(expires('8/23/2018'));

答案 2 :(得分:0)

您可以使用momentjs的diff() function

来区分两个日期

以下是工作代码:

function expiryDate(date_string) {
  var expiration = moment(date_string).format("YYYY-MM-DD");
  var current_date = moment().format("YYYY-MM-DD");
  var days = moment(expiration).diff(current_date, 'days');
  return days;
}

alert("Days remaining = " + expiryDate("2018-05-05"));
console.log("Days remaining = " + expiryDate("2018-05-05"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/moment.js"></script>

答案 3 :(得分:-1)

最初与时俱进有时会做很多工作,而且往往会投入大量时间,也许是时刻.js库可能会根据需要为您提供解决方案,特别是isBetween

点击以下链接。

moment.js

var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days')