javascript - 从 JavaScript 中的周数获取不正确的日期范围
问题描述
我有一个 javascript 函数,它根据周数计算日期范围
Date.prototype.getWeek = function weekCalc() {
const date = new Date(this.getTime());
date.setHours(0, 0, 0, 0);
date.setDate((date.getDate() + 3 - (date.getDay() + 6)) % 7);
const week1 = new Date(date.getFullYear(), 0, 4);
return 1 + Math.round((((date.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6)) % 7) / 7);
};
const getDateRangeOfWeek = (weekNo, y) => {
const d1 = new Date(`${y}`);
const pastDays = d1.getDay() - 1;
d1.setDate(d1.getDate() - pastDays);
d1.setDate(d1.getDate() + 7 * (weekNo - d1.getWeek()));
const rangeIsFrom = `${`0${d1.getDate()}`.slice(-2)}/${`0${d1.getMonth() + 1}`.slice(-2)}/${d1.getFullYear().toString().substring(2)}`;
d1.setDate(d1.getDate() + 6);
const rangeIsTo = `${`0${d1.getDate()}`.slice(-2)}/${`0${d1.getMonth() + 1}`.slice(-2)}/${d1.getFullYear().toString().substring(2)}`;
return `${rangeIsFrom}-${rangeIsTo}`;
};
console.log(getDateRangeOfWeek(52, 2016));
当您根据 ISO 8061 在 2016 年第 52 周对其进行测试时,它会给出
getDateRangeOfWeek(52, 2016);
"19/12/16-25/12/16"
这是不正确的,请在此处查看https://www.calendar-week.org/2016/52
我不确定上述实现中出了什么问题?
解决方案
我没有费心挖掘您的代码,但我确实拼凑了一个可以检索所需结果的解决方案:
function addDays(date, days) {
let newDate = new Date(date);
newDate.setDate(newDate.getDate() + days)
return newDate;
}
let locale = new Intl.DateTimeFormat('en-GB',{ dateStyle: 'short'});
function formatDate(date) {
return locale.format(date)
}
function getDateOfISOWeek(w, y) {
let simple = new Date(y, 0, 1 + (w - 1) * 7);
let dow = simple.getDay();
let ISOweekStart = simple;
if (dow <= 4)
ISOweekStart.setDate(simple.getDate() - simple.getDay() + 1);
else
ISOweekStart.setDate(simple.getDate() + 8 - simple.getDay());
let ISOweekEnd = addDays(ISOweekStart, 6);
//let dateSpanLong = `${ISOweekStart} to ${ISOweekEnd}`; // date objects to do with what you please;
let dateSpanShort = `${formatDate(ISOweekStart)} to ${formatDate(ISOweekEnd)}`;
return dateSpanShort;
}
console.log(getDateOfISOWeek(52,2016)) // returns '26/12/2016 to 01/01/2017'
这是Intl.DateTimeFormat 选项的一个很好的参考...
我借来的另一篇 StackOverflow 帖子用于添加 6 天......
我用它来获得正确的一周开始
推荐阅读
- asp.net-mvc - Asp.net Odata Web API Cross Origin Put and Pacth Request Browser Preflight Error
- android - 将字符串 url 数据放入位图
- sql - 带选择的 SQL INSERT
- jquery - 如何使用fabric js在画布上自动缩放具有纵横比的大图像
- mongodb - Mongo Db 在 Json 过滤器中查询 Json
- javascript - Vue JS Spinner 用于同一页面中的多个组件(单个应用程序)
- powershell - 根据属性计数将对象子集传递到管道中?
- python - 将图像中的像素迭代为 numpy 数组
- mysql - 如何在codeigniter的控制器中传递下拉列表值id
- python - 比较 MQTT 主题上先前和当前发布的值