javascript - 如何获得两个时刻之间的日历周差?
问题描述
我想在javascript中获取两个日期之间的日历周差。
例子:
a='09-May-2018'
b='14-May-2018'
这两者之间的日历周差为 2。
我首先将日期转换为时刻,并通过 Moment.js diff 方法获得以周为单位的差异。但这是将 7 天视为一周,并在上述示例中给我 1 天。
我想得到周数,然后减去它。但是,如果日期是两个不同的年份。我会得到错误的结果。喜欢'01-Jan-2017'
并将'01-Jan-2018'
周数设为 1。
有没有更好的方法来有效地做到这一点?
解决方案
您还可以在纯 javascript 中计算周差。由于您还没有完全解释如何确定周数的规则,所以我做了一些猜测。以下:
- 默认一周的第一天为星期一
- 复制日期并将它们移动到一周的开始
- 确保 d0 在 d1 之前
- 计算周数为
1 + (endDate - startDate) / 7
- 可以使用可选的第三个参数设置一周的开始日期:0 = 星期日,1 = 星期一,等等。
- 结果总是积极的。如果日期在同一周,则差值为 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)));
推荐阅读
- java - 将文本动态附加到 Jackson 中任何对象的所有属性名称
- python - 调用全局变量时未定义变量
- unique-id - 为所有 Pod 全局分配每个 Pod 8 位唯一 ID
- node.js - 为 pdf 文件创建读取流以上传到 s3 存储桶
- spring-boot - 为什么使用 RedisTemplate 在 springboot 中抛出 NoSuchMethodError?
- r - 通过使用 R 选择上一行中的值来填充缺失值
- elasticsearch - Elasticsearch:为什么无法通过“term”查询找到但可以通过“match”查询找到?
- android - 如何将另一个片段添加到 ViewPager2 中?
- swift - Swift:使用 base64 编码的字符串填充错误
- angular - 如何为 tabPanel 定义静态索引