gpt4 book ai didi

javascript - 获取特定时间段在另一个时间段的小时数

转载 作者:搜寻专家 更新时间:2023-10-30 21:48:25 24 4
gpt4 key购买 nike

非常挣扎,所以让我让你痛苦一个场景:

餐厅服务员每小时赚取 15 美元,但在 21.00 到 02.30 之间,他每小时额外获得 3 美元。现在我所拥有的是作为 Date 对象的轮类的“开始”和“结束”,我想计算轮类中有多少小时的额外付费期(如果有的话)。(记住开始和结束轮类时间可以是任何东西——而且它变得困难)

我通过使用大量 if 语句使其工作,但这绝对不是正确的方法。我在这里添加我的代码 link但是你知道这是一团糟(在那个代码 fui 中有两个不同的时间段和额外的报酬)。任何人有更好的计算方法的想法吗?(在这里可以提供任何帮助的类吗?)

static calculateShiftSalary(shift: Shift, employee: Employee): Shift {
const extraPaidStart = 22
const extraPaidEnd= 2.5 // meaning 02.30 o'clock -of the next day here

let start:Date = shift.startDate
let end:Date = shift.endDate

let extraHours:number =
getNumberOfExtraPaidHours(start,end,extraPaidStart,extraPaidEnd)
}

所以如果你在 20.00 和 23.30 之间有类次 ->'extraHours'=1,5 并且如果类次在 23.00 和 02.00 之间 ->extraHours=3h

extraPaidStart 和 extraPaidEnd 可以更改为日期 ofc 如果这有任何帮助 (y)

最佳答案

让我们先来看最简单的情况:我们的 worker 只工作了一天。如果加类时间过夜,时间表将如下所示:

extra paid ---|-- regular paying ---------|---- extra paid ---
|--------- working time -----------------------------|
|--- 1 -------|--------------- 2 ----------------|---- 3 ---|

如果额外的时间只是一天,实际上更简单:

|----------- regular paying -------|------ extra paid ----|----|
|------ working time -----------------|
|----- 1 -----------------------------|- 2 -|

所以我们只需要计算 worker 工作的三个不同范围,所有单位都以分钟为单位:

 function paymentRange(payment: number, start: number, end: number) {
return function calculatePayment(startWorking: number, endWorking: number) {
if(start < end) {
const rangeStart = Math.max(start, startWorking);
const rangeEnd = Math.min(end, endWorking);
return Math.max(rangeEnd - rangeStart, 0) / 60 * payment;
} else {
const morning = Math.max(end - startWorking, 0);
const evening = Math.max(endWorking - start, 0)
return (morning + evening) / 60 * payment;
}
}
}

现在我们只需要一种方法来合并多个支付:

 function combinedPayment(...payments) {
return (start, end) => payments.reduce((sum, payment) => sum + payment(start, end), 0);
}

所以要获得一天的付款,我们可以这样做:

 const calculatePayment = combinedPayment(
paymentRange(3/*$*/, 22/*h*/ * 60, 2/*h*/ * 60 + 30/*min*/),
paymentRange(15/*$*/, 0/*min*/, 24/*h*/ * 60)
);

// If he worked from 1h to 22h:
calculatePayment(1/*h*/ * 60, 22/*h*/ * 60)

现在我们只需要将我们的日期范围划分为天数,并计算天数的付款:

 const dateToMins = date => date.getHours() * 60 + date.getMinutes();

const toWholeDay = date => new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);
const min = (a, b) => new Date(Math.min(+a, +b));
const max = (a, b) => new Date(Math.max(+a, +b));

function paymentForDateRange(payment, start: Date, end: Date) {
let pay = 0;
let today = toWholeDay(start);
while(+today < +end) {
const nextDay = new Date(today + 1000 * 60 * 60 * 24);
const startWorking = max(start, today);
const endWorking = min(end, nextDay);
pay += payment(dateToMins(startWorking), dateToMins(endWorking));
today = nextDay;
}
return pay;
}

所以我们终于可以做到:

paymentForDateRange(calculatePayment, new Date(), new Date())

PS:我无法测试其中的每个部分,它可能无法完全工作

关于javascript - 获取特定时间段在另一个时间段的小时数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50448122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com