我有一个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);
}
}
答案 0 :(得分:0)
也许我不完全理解你的问题,但我认为以下内容应该有效:
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;