У меня вопрос по JavaScript / математике.Я застрял с одним заданием в течение двух дней, и я думаю, что я полный идиот, поскольку я не могу понять это ... Снимок экрана
Я создаю недельный календарь со сменами от7 утра до 8 вечера, но у меня может быть смена, которая, например, 2 дня (или более).
Проблема в том, что я могу перетащить событие календаря на календарь, а затем мне нужно рассчитать новыйdateTo from dateFrom, который я получаю из div, на котором я его поместил.
Проблема в том, что когда я пытаюсь перетащить элемент в другое время, мне нужно поместить dateFrom в тот момент, когда я его перетаскивал, но затем яМне нужно рассчитать часы, чтобы я получал такое же количество времени, но проблема в том, что когда мероприятие растягивается на несколько дней, мне нужно, чтобы оно закончилось на следующий день после 7 часов утра, а не среди ночи.Например, у меня было событие с 15:00 до 17:00 следующего дня, а затем я переместил его в 7:00 следующего дня, поэтому мне нужно, чтобы событие завершилось в 9:00 следующего дня.
Есть ли у кого-то такая же проблема или решение?за это?Надеюсь, что это имеет смысл, большое спасибо.
Вот код, который я использую сейчас, он почти работает, но иногда я получаю неправильную дату / время (обычно это удаляет 10 часов от даты).
export function getCorrectDateAfterDrop(originalDateFrom, originalDateTo, dateFrom) {
const NIGHT_TIME = 11;
dateFrom = moment(dateFrom);
originalDateTo = moment(originalDateTo);
originalDateFrom = moment(originalDateFrom);
let hoursDiff = moment.duration(originalDateTo.diff(originalDateFrom)).asHours();
const sign = Math.sign(hoursDiff);
if (originalDateTo.isAfter(moment(originalDateFrom).hours(20))) {
hoursDiff = (hoursDiff > NIGHT_TIME) ? (hoursDiff - NIGHT_TIME) : hoursDiff;
}
let finalDateToBeChecked = moment(dateFrom).add((hoursDiff * sign), 'hours');
let isDateFromSameAsDateTo = moment(dateFrom).isSame(finalDateToBeChecked, 'day');
if (isDateFromSameAsDateTo && finalDateToBeChecked.hours() < 20) {
// I think the problem is here, but I can't figure it out :D
return finalDateToBeChecked.format();
} else {
const diffUntilShiftEnds = moment.duration(moment(dateFrom).hours(20).diff(dateFrom)).asHours();
hoursDiff -= diffUntilShiftEnds;
const finalDateFrom = moment(dateFrom).add(1, 'days').hours(7);
const finalDateTo = moment(dateFrom).add(1, 'days').hours(7).add(hoursDiff, 'hours');
return getCorrectDateAfterDrop(finalDateFrom, finalDateTo, finalDateFrom);
}
}