首页 > 解决方案 > 如何获得两个时刻之间的日历周差?

问题描述

我想在javascript中获取两个日期之间的日历周差。

例子:

a='09-May-2018'
b='14-May-2018'

这两者之间的日历周差为 2。

我首先将日期转换为时刻,并通过 Moment.js diff 方法获得以周为单位的差异。但这是将 7 天视为一周,并在上述示例中给我 1 天。

我想得到周数,然后减去它。但是,如果日期是两个不同的年份。我会得到错误的结果。喜欢'01-Jan-2017'并将'01-Jan-2018'周数设为 1。

有没有更好的方法来有效地做到这一点?

标签: javascriptdatelogicmomentjs

解决方案


您还可以在纯 javascript 中计算周差。由于您还没有完全解释如何确定周数的规则,所以我做了一些猜测。以下:

  1. 默认一周的第一天为星期一
  2. 复制日期并将它们移动到一周的开始
  3. 确保 d0 在 d1 之前
  4. 计算周数为1 + (endDate - startDate) / 7
  5. 可以使用可选的第三个参数设置一周的开始日期:0 = 星期日,1 = 星期一,等等。
  6. 结果总是积极的。如果日期在同一周,则差值为 1。

这仅在结束日期晚于开始日期时才能正常工作。

/* Calculate weeks between dates
** Difference is calculated by getting date for start of week,
** getting difference, dividing and rounding, then adding 1.
** @param {Date} d0 - date for start
** @param {Date} d1 - date for end
** @param {number} [startDay] - default is 1 (Monday)
** @returns {number} weeks between dates, always positive
*/
function weeksBetweenDates(d0, d1, startDay) {

  // Default start day to 1 (Monday)
  if (typeof startDay != 'number') startDay = 1;

  // Copy dates so don't affect originals
  d0 = new Date(d0);
  d1 = new Date(d1);

  // Set dates to the start of the week based on startDay
  [d0, d1].forEach(d => d.setDate(d.getDate() + ((startDay - d.getDay() - 7) % 7)));

  // If d1 is before d0, swap them
  if (d1 < d0) {
    var t = d1;
    d1 = d0;
    d0 = t;
  }

  return Math.round((d1 - d0)/6.048e8) + 1;
}

console.log(weeksBetweenDates(new Date(2018, 4, 9), new Date(2018, 4, 14)));


推荐阅读