有一个问题 - 消除工作日结束时间的错误。
我用拐杖解决了它,我真的很想看到一个好的解决方案的例子,我的代码如下,这里是问题陈述:
员工有 8 小时的 3 个班次:从 00:00 到 8:00 - 1 班,从 8:00 到 16:00 - 第二班,从 16:00 到第二天开始 - 第三班。同时,员工在不知道的时间内完成轮班的时间稍晚,但不超过一个轮班(或 8 小时)的规模。连续分配一名工人只工作一班。
移位数 1 或 2 或 3 称为输入参数。
如果员工已经工作并“爬”到其他人的班次,则有必要编写一个函数,该函数将返回上一班次最后一秒的日期和时间,而不是真正的结束时间。
例子:
1号班工人于2018年5月1日8:30交任务,函数应返回2018年5月1日7:59。在不准确的情况下,当从第 3 班转移到第 1 班时,必须考虑日期。
这是我的解决方案:
function computeLastUpdate(shiftNumber) {
let lastUpdate = new Date();
const beforeMidnight = new Date(lastUpdate.getFullYear(), lastUpdate.getMonth(), lastUpdate.getDate(), 23, 59, 59);
const afterMidnight = new Date(lastUpdate.getFullYear(), lastUpdate.getMonth(), lastUpdate.getDate(), 0, 0, 0);
const eightAM = new Date(lastUpdate.getFullYear(), lastUpdate.getMonth(), lastUpdate.getDate(), 8, 0, 0);
const fourPM = new Date(lastUpdate.getFullYear(), lastUpdate.getMonth(), lastUpdate.getDate(), 16, 0, 0);
if (shiftNumber === 1 && lastUpdate > eightAM && lastUpdate < fourPM) {
lastUpdate = new Date(lastUpdate.getFullYear(), lastUpdate.getMonth(), lastUpdate.getDate(), 7, 59, 59);
} else if (shiftNumber === 2 && lastUpdate > fourPM && lastUpdate < beforeMidnight) {
lastUpdate = new Date(lastUpdate.getFullYear(), lastUpdate.getMonth(), lastUpdate.getDate(), 15, 59, 59);
} else if (shiftNumber === 3 && lastUpdate > afterMidnight && lastUpdate < eightAM) {
lastUpdate = new Date(lastUpdate.getFullYear(), lastUpdate.getMonth(), lastUpdate.getDate() - 1, 23, 59, 59);
}
return lastUpdate;
}
看起来很麻烦,而且措辞с 16:00 до начала следующих суток有些混乱。一般来说,是否有可能更优雅地解决这个问题?
然后你可以适应这样的代码。这比您的示例可读性差,但始终如一
如果社区纠正我示例中的潜在缺陷,我也会很高兴。