在日历活动停止后计算新日期

时间:2018-06-12 15:05:41

标签: javascript reactjs momentjs

我有一个JavaScript / Math问题。 我现在被困在一项任务中两天了,我想我完全是白痴,因为我无法弄明白...... Screenshot

我正在创建一个星期日历,从早上7点到晚上8点都有班次,但我可以换班,例如2天(或更长)。

问题在于我可以在日历上拖放日历事件,然后我需要从dateFrom计算新的dateTo,这是从我放置它的div中得到的。

问题在于,当我尝试将项目拖放到另一个时间时,我需要将dateFrom放置到每次拖动时,但是我需要计算小时数以便我得到相同的时间,但问题是当事件被延长多天时,我需要事件在早上7点之后完成下一个日期,而不是在半夜。例如,我在第二天下午3点到下午5点举行了活动,然后我把它搬到了第二天的晚上7点,所以我需要在第二天上午9点完成活动。

有没有人对此有相同的问题或解决方案? 希望它有意义,非常感谢。

这是我现在正在使用的代码,它几乎可以使用,但有时我会得到错误的日期/时间(通常它会从日期开始删除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 :(得分:0)

也许我不完全理解你的问题,但我认为以下内容应该有效:

&#13;
&#13;
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
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.13.0/moment.min.js"></script>
&#13;
&#13;
&#13;