Javascript: Как получить СЛЕДУЮЩИЙ происходящий X день недели - PullRequest
0 голосов
/ 07 декабря 2018

Я встроил в свое приложение функцию, позволяющую запланировать событие в будущем.IE: Мероприятие проходит каждую среду в 18:30.Мне нужно показать пользователю, основываясь на текущей текущей дате, когда СЛЕДУЮЩАЯ среда -

Если сегодня четверг 6 декабря 2018 года, он должен показать пользователю следующее событие на «Ср 12 декабря 2018 года.в 18:30 "

Если сегодня" вторник, 8 января 2019 года ", необходимо показать пользователю следующее событие в" Ср 9 января 2019 года в 18:30 ".

Первоначальная дата начала события записана в моей БД как первый день текущей серии.IE: ср. 10 сентября 2018. Я использую эту дату начала, чтобы попытаться вычислить каждую следующую среду.

  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), иСЛЕДУЮЩЕЕ событие показывает неправильный следующий день.В приведенном выше примере (жестко закодировано в dObject) отображается Mon Dec 10, 2018, когда должно отображаться Wed Dec 12, 2018.

Также, если сегодня среда в 18:00, следующее событие все еще должно отображаться как СЕГОДНЯ в6:30 вечера.Мероприятие длится минимум 2 часа ... поэтому в идеале я хотел бы также выяснить, как показать что-то вроде: Next Event: happening now til 8:30pm

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Существует ряд проблем с вашим кодом.Дано:

 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)) ;

, кажется, пытается получитьразница в днях между двумя датами, однако она не учитывает временную составляющую, поэтому 3 ноября с 09:00 до 3 ноября 09:01 будет 1 день, хотя в тот же день и только через 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());

Исходный объект должен иметь повторяющуюся единицу периода и кратный.Я добавил их, но не использовал их, вы должны увидеть, куда они идут.Вам также нужно иметь функции для сложения и вычитания часов, дней, месяцев и т. Д., Чтобы использовать их.Здесь уже есть множество вопросов и ответов по этим темам.

Если бы я проектировал повторяющийся объект события, он имел бы намного больше информации, чем выше, с методами обработки различных сценариев.

0 голосов
/ 07 декабря 2018

Используйте момент, не пытайтесь написать свои собственные функции даты для чего-то большего, чем простые вычисления.

https://momentjs.com/

Найти следующий экземпляр данного дня недели (т.е.Понедельник) с moment.js

...