在Javascript中从给定日期获取过去一周7天的时间段



我试图从今天的日期获得过去星期三到过去星期二(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);

设置PastWednesdayPastTuesday早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()));

最新更新