Javascript:如何获取每周X天发生的NEXT

时间:2018-12-06 22:06:08

标签: javascript date datetime date-arithmetic

我正在我的应用程序中构建功能,该功能允许将事件安排在将来。 IE:该活动每星期三晚上6:30举行。我需要根据今天的当前日期向用户显示下一个星期三的时间。

如果今天是2018年12月6日星期四,则需要向用户显示下一个事件是“ 2018年12月12日星期三下午6:30”

如果今天是“ 2019年1月8日星期二”,则需要向用户显示下一个事件是“ 2019年1月9日星期三下午6:30”

该活动的原始开始日期被记录在我的数据库中,作为进行中系列活动的第一天。 IE:2018年9月10日,星期三。我使用该开始日期来尝试计算下一个星期三。

  function nextEvent(cEvent) {
      var startDate = cEvent.ceDate+ ", " +cEvent.ceTime ;
      var ceDate = new Date(startDate) ;
      var curDate = new Date() ;
      var timeDiff = Math.abs(curDate.getTime() - ceDate.getTime()) ;
      var diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24)) ;
      var addDays = Math.ceil(diffDays / 7) * 7 ;
      var futureDate = ceDate.setDate(ceDate.getDate() + addDays) ;
      var futureEvent = ceDate.format('D, M d, Y @ g:i a') ;
      return futureEvent ;
    }
  }

  // this date object START event is Wed Sept 10, 2018
  var dObject = {"ceDate":"2018-09-10","ceTime":"18:30:00"}
  var nextDate = nextEvent(dObject) ;

我正在遍历多个事件,所有事件都使用不同的开始日期(即ceDate),并且NEXT事件第二天显示错误。上面的示例(用dObject硬编码)在显示Mon Dec 10, 2018时显示Wed Dec 12, 2018

同样,如果今天是星期三下午6点,则下一个活动仍需要在今天下午6:30进行显示。该活动持续至少2个小时...因此,理想情况下,我还想弄清楚如何显示以下内容:Next Event: happening now til 8:30pm

2 个答案:

答案 0 :(得分:0)

使用时间,除了简单的计算外,不要尝试编写自己的日期函数。

https://momentjs.com/

Find next instance of a given weekday (ie. Monday) with moment.js

答案 1 :(得分:0)

您的代码存在许多问题。鉴于:

 var dObject = {"ceDate":"2018-09-10","ceTime":"18:30:00"}

然后

var startDate = cEvent.ceDate+ ", " +cEvent.ceTime ;

将生成类似“ 2018-09-10,18:30:00”的字符串,这不是ECMAScript支持的格式,所以当您这样做时:

var ceDate = new Date(startDate);

结果与实现有关,很可能导致无效的日期。

下一步:

var diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24)) ;

似乎试图获取两个日期之间的天数差异,但是它不包含时间部分,因此即使是同一天,11月3日09:00至11月3日09:01也将是1天仅仅一分钟后。

无论如何,根据确定每周事件的下一次发生的要求,您可以获得当周的事件,如果通过了,则增加7天,例如

var dObject = {
  "ceDate": "2018-09-10", // Mon, 9 Sep 2018
  "ceTime": "18:30:00",
  "recurrenceUnit": "day",
  "recurrenceLength": 7
}

// Helper to parse ISO date as local
function parseISOLocal(s) {
  var b = s.split(/\D/);
  return new Date(b[0],b[1]-1,b[2]);
}

function nextEvent(obj) {
  // Get today's details
  var now = new Date();
  var day = now.getDay();

  // Get event details
  var evtDate = parseISOLocal(obj.ceDate);
  var evtDay = evtDate.getDay();
  
  // Set nextEvt to event for this week
  var nextEvt = new Date(+now);
  nextEvt.setHours(0,0,0,0);
  nextEvt.setDate(nextEvt.getDate() - day + evtDay);
  nextEvt.setHours(...obj.ceTime.split(/\D/));
  
  // If the nextEvent has passed, add 7 days
  // Should use the recurrenceUnit and recurrenceLength
  if (nextEvt < now) {
    nextEvt.setDate(nextEvt.getDate() + 7)
  }

  return nextEvt;
}

console.log(nextEvent(dObject).toString());

源对象需要具有重复周期单位和多个。我已经添加了这些但没有使用它们,您应该能够看到它的去向。您还需要具有用于添加和减去小时,天,月等的功能,以利用它们。关于这些主题,这里已经有很多问题和答案。

如果我正在设计一个周期性事件对象,那么它将具有比上面更多的信息来处理各种情况。