Рассчитать новую дату после падения календарного события - PullRequest
0 голосов
/ 12 июня 2018

У меня вопрос по 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);
    }
}

1 Ответ

0 голосов
/ 12 июня 2018

Возможно, я не до конца понимаю ваш вопрос, но думаю, что-то вроде следующего должно работать:

function getCorrectDateAfterDrop(originalDateFrom, originalDateTo, dateFrom) {
    return originalDateTo - originalDateFrom + dateFrom;
}


// verify it works:

var origFrom = Date.parse('01 Jan 2018 05:00:00');
var origTo = Date.parse('02 Jan 2018 07:00:00');
var newFrom = Date.parse('02 Jan 2018 01:00:00');
var newTo = getCorrectDateAfterDrop(origFrom, origTo, newFrom)

console.log((Date.parse('03 Jan 2018 03:00:00') === newTo)) // true
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.13.0/moment.min.js"></script>
...