【问题标题】:Calculate new date after calendar event drop日历事件删除后计算新日期
【发布时间】:2018-06-12 15:05:41
【问题描述】:

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

我正在创建一个从早上 7 点到晚上 8 点轮班的周历。但我可以有 2 天(或更多)的轮班。

问题是我可以将日历事件拖放到日历上,然后我需要从 dateFrom 计算新的 dateTo,该 dateFrom 是从我放置它的 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);
    }
}

【问题讨论】:

    标签: javascript reactjs momentjs


    【解决方案1】:

    也许我不完全理解您的问题,但我认为类似以下的内容应该可行:

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

    【讨论】:

    • 是的,这行得通,但我需要的是活动不应该在半夜结束,例如当你从晚上 7 点开始有 3 小时的活动时,它应该在上午 9 点结束明天。无论如何,谢谢您的快速回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    相关资源
    最近更新 更多