获取 2 时间戳之间的一整天

get all day between 2 timestamp

我正在尝试获取 2 个时间戳和特定日期名称之间的所有日期。

我有一个 start1 是时刻(第一个日期),end1 是时刻(最后一个日期)。 我有一个带有 id (day) 的日期列表。

this.datesDailySelected = [];
var start1 = moment(new Date(this._data.row.plannedDispatch));
var end1 = moment(this.datesForm.controls["dailyExpiryDate"].value);
this.selectedItemsList.forEach((item) => {
  var current = start1.clone();
  var day;
  switch (item.name) {
    case "Sunday":
      day = 0;
      break;
    case "Monday":
      day = 1;
      break;
    case "Tuesday":
      day = 2;
      break;
    case "Wednesday":
      day = 3;
      break;
    case "Thursday":
      day = 4;
      break;
    case "Friday":
      day = 5;
      break;
    case "Saturday":
      day = 6;
      break;
  }
  while (current.day(7 + day).isBefore(end1)) {
    this.datesDailySelected.push(current.clone().format("YYYY-MM-DD"));
  }
  console.log(this.datesDailySelected);
});

无论我在哪里选择 2 个日期和一个特定的日期名称示例(星期五),我都会检索本周没有一天的所有日期!

我的代码有问题。

真实例子:

start1 : "2021-12-20T07:50:00.000Z"
end1: "2021-12-25T07:50:00.000Z" 
day choosed: friday with day = 5

output = empty list.

output must be ["2021-12-24"]

示例时间戳是 UTC,但工作是使用本地日期,因此以下内容也是如此。这可能会在具有不同时区偏移量的主机上产生不同的结果。如果你想要所有UTC,那么只需将所有方法更改为UTC方法(setHours to setUTCHours, getDategetUTCDate,等等)。

您可以使用数组和 indexOf 而不是长开关块,更简单地将日期名称转换为数字。

获取特定日期的第一个实例也相当简单,但您必须检查它是否在开始之前(例如,如果日期范围是星期四到星期一并且您想要星期日,那么算法会发现星期四之前的太阳,而不是之后)。所以有一个检查,如果它在开始之前,则增加一周。

然后只需检查结束日期并将时间戳推入每一天的结果数组,然后添加 7 天,等等。

您可以使用库来完成这一切,但在普通 JS 中并不难:

function getDaysBetween(d1, d2, day) {
  // Convert day name to number
  let days = ['su','mo','tu','we','th','fr','sa'];
  let dayNum = days.indexOf(day.toLowerCase().substr(0,2));
  // Convert timestamps to Dates and set to start of day
  let start = new Date(d1);
  start.setHours(0,0,0,0);
  let end = new Date(d2);
  end.setHours(0,0,0,0);
  // Get first instance of day name in same week as start
  let d = new Date(start);
  d.setDate(d.getDate() - d.getDay() + dayNum);
  // If before start, add 7 days
  if (d < start) d.setDate(d.getDate() + 7);
  
  let result = [];
  while (d <= end) {
    result.push(d.toLocaleDateString('en-CA'));
    d.setDate(d.getDate() + 7)
  }
  
  return result;
}


let start = '2021-12-20T07:50:00.000Z';
let end = '2021-12-25T07:50:00.000Z'; 
let day = 'Friday';

console.log(getDaysBetween(start, end, day));