【问题标题】:get all day between 2 timestamp获取 2 个时间戳之间的全天
【发布时间】:2022-01-22 05:04:24
【问题描述】:

我正在尝试获取 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"]

【问题讨论】:

    标签: javascript angular date momentjs angular-moment


    【解决方案1】:

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

    您可以更简单地使用数组和 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));

    【讨论】:

    • 输出应该是 2021-12-24。 @RobG
    • @jackros——哈,是的。做了一些重构,并没有更新所有必需的变量名。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 2020-09-21
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 2011-05-04
    相关资源
    最近更新 更多