我试图从今天的日期获得过去星期三到过去星期二(7天)的日期范围。假设当前日期是2022-05-01(5月1日),我希望结果是过去的星期二(结束日期)到过去的星期三(开始日期=过去的星期二-7天)即2022年4月20日至2022年4月26日
function getStartAndEndDates () {
var now = new Date('2022-05-01'); //May 1st 2022
var day = now.getDay();
var diff = (day <= 2) ? (7 - 2 + day ) : (day - 2);
var PastTuesday = new Date();
var PastWednesday = new Date(PastTuesday.setDate(now.getDate() - diff));
console.log('End date is', PastTuesday.toISOString());
PastWednesday.setDate(PastTuesday.getDate() - 6);
console.log('Start Date is',PastWednesday.toISOString());
return[PastWednesday,PastTuesday];
}
Output obtained is:
End date is 2022-03-27T19:25:35.726Z //here month is set to March
Start Date is 2022-03-21T19:25:35.726Z
Expected Result is
End date is 2022-04-26T19:25:35.726Z // month is supposed to be April
Start Date is 2022-04-20T19:25:35.726Z
如何更改代码以获得预期的结果?
你应该这样做
function getLastWeek(date) {
var today = new Date(date);
var lastWeek = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 7);
return lastWeek;
}
// Your DATE
date = '2022-05-01'
//
var lastWeek = getLastWeek(date);
var lastWeekMonth = lastWeek.getMonth() + 1;
var lastWeekDay = lastWeek.getDate();
var lastWeekYear = lastWeek.getFullYear();
var lastWeekDisplay = lastWeekMonth + "/" + lastWeekDay + "/" + lastWeekYear;
console.log(lastWeekDisplay);
在你的代码中:
var now = new Date('2022-05-01'); //May 1st 2022
YYYY-MM-DD格式的日期被解析为UTC,因此上面的代码将创建一个表示2022-05-01T00:00:00Z的日期对象。
var day = now.getDay();
这将返回本地日期。对于偏移量为零或正的用户,它将返回0(星期日),但对于偏移量为负的用户,它将返回6(星期六),因为他们的本地日期仍然是前一天。
var diff = (day <= 2) ? (7 - 2 + day ) : (day - 2);
给定day为0(对我来说),上面设置diff为5。
var PastTuesday = new Date();
这为"现在"创建了一个日期,对我来说是4月17日。
var PastWednesday = new Date(PastTuesday.setDate(now.getDate() - diff));
在上面,现在。getDate返回1,而1 - 5是-4,因此它将PastTuesday的日期设置为-4。现在PastTuesday是在四月,所以它被设置为四月开始前4天,即3月27日。
注意,这会调整PastTuesday,同时创建PastWednesday的副本。
console.log('End date is', PastTuesday.toISOString());
显示等效的UTC日期和时间,时间表示代码运行的时间。
PastWednesday.setDate(PastTuesday.getDate() - 6);
设置PastWednesday比PastTuesday早6天。
无论如何,需要做的是使用UTC或本地,不要将两者混合。
尽可能与原始代码保持一致,并假设将YYYY-MM-DD格式的时间戳解析为函数,请考虑以下内容,它将所有操作都作为本地操作:
// Parse timestamp in YYYY-MM-DD format as local
function parseISOLocal(s = new Date().toLocaleDateString('en-CA')) {
let [y, m, d] = s.split(/D/);
return new Date(y, m-1, d);
}
// Get week Wed to Tue prior to passed date
function getStartAndEndDates (date) {
// Parse timestamp as local
var pastTuesday = parseISOLocal(date);
// Adjust pastTuesday to previous Tuesday
var day = pastTuesday.getDay();
var diff = (day <= 2) ? (7 - 2 + day ) : (day - 2);
var pastWednesday = new Date(pastTuesday.setDate(pastTuesday.getDate() - diff));
console.log('End date is', pastTuesday.toDateString());
// Adjust pastWednesday to previous Wednesday
pastWednesday.setDate(pastTuesday.getDate() - 6);
console.log('Start Date is',pastWednesday.toDateString());
return [pastWednesday, pastTuesday];
}
// Sunday 1 May 2022
console.log(getStartAndEndDates('2022-05-01').map(d => d.toDateString()));
// Current date
console.log(getStartAndEndDates().map(d => d.toDateString()));