我正在我的应用程序中构建功能,该功能允许将事件安排在将来。 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
答案 0 :(得分:0)
使用时间,除了简单的计算外,不要尝试编写自己的日期函数。
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());
源对象需要具有重复周期单位和多个。我已经添加了这些但没有使用它们,您应该能够看到它的去向。您还需要具有用于添加和减去小时,天,月等的功能,以利用它们。关于这些主题,这里已经有很多问题和答案。
如果我正在设计一个周期性事件对象,那么它将具有比上面更多的信息来处理各种情况。