Лучший способ найти временные отрезки в таймфрейме - PullRequest
0 голосов
/ 29 сентября 2019

В настоящее время я создаю приложение, в котором мне нужно получать пособия за определенные отработанные часы.

Например, я работаю с 15:00 до 22:00. С этого времени пособие будет предоставляться с 20:00 до 22:00 20% и с 22:00 до 23:00 35%.

До сих пор я не продвигался дальше, чем довольно сложная конструкция.

if startUur <= 20 && eindUur >= 22 || 20..<22 ~= startUur || 20..<22 ~= eindUur || startUur > 20 && eindUur <= 22 && startMinuut > 0 || startUur < 20 {
//code to calculate allowance
}

Я искал хороший и лучший способ сделать это, но не могу его найти.

Есть ли лучший способ, или я обязан таким способом с конструкцией if?

1 Ответ

1 голос
/ 30 сентября 2019
struct TimeAndMoneyFrame {
    var timeHourStart:Int = 0
    var timeHourEnd:Int = 0
    var percentage: Double = 0
}

extension TimeAndMoneyFrame {
    func timeLength() -> Int {
        return timeHourEnd - timeHourStart
    }
}

let 2000to2200 = TimeAndMoneyFrame(timeHourStart = 20, timeHourEnd = 22, percentage = 0.2)
let 2200to2300 = TimeAndMoneyFrame(timeHourStart = 22, timeHourEnd = 23, percentage = 0.35)
let timeArray:[TimeAndMoneyFrame] = [2000to2200]

//Assuming 'startUur' means startingHour
//Assuming 'eindUur' means endingHour
let startUur:Int = someHour // You define some hour
let eindUure:Int = someHour // You define some hour
let hourlyRateOfPay: Double = somePay // You define some pay
var totalPay: Double = 0

for time in timeArray {
    let start = time.timeHourStart
    let end = time.timeHourEnd
    let percent = time.percentage

    //Encompasses entirely
    if(start > startUur && end < eindUur) {
        totalPay += (hourlyRateOfPay * (1 + percent) * time.timeLength())
    }

    //Only encompassed the left side - i.e., their time worked ends within this time frame
    else if(start > startUur) {
        let timeWithinThisFrame = eindUur - start
        totalPay += (hourlyRateOfPay * (1 + percent) * (timeWithinThisFrame/time.timeLength())
    }

    //Only encompassed right side - i.e., the beginning of the starts within this time frame
    else if(eindUur < end) {
        let timeWithinThisFrame = end - startUur
        totalPay += (hourlyRateOfPay * (1 + percent) * (timeWithinThisFrame/time.timeLength())
    }
}

Итак, мы можем разбить эту проблему на пару проблем.

1) Определение структуры / класса, которая охватывает период времени с соответствующим процентом

2) Алгоритм, необходимый для расчета общей заработной платы

У меня есть базовое предположение.

1) Вы говорите, что пособия - человек получает 35%, если он работает с 2200-2300 - я принял это как бонус, так сказать 1,35% от нормальной почасовой ставки. Если это не так, идея потребления временных интервалов по одному была бы одинаковой. Единственная разница может заключаться в расчете totalPay.

Мой алгоритм просматривает каждый таймфрейм и определяет, пересекает ли текущее время какой-либо из таймфреймов. Если это произойдет, я подсчитываю, сколько он перехватывает, и рассчитываю ставку оплаты.

Примечание: я все это кодировал на SO - могут быть некоторые синтаксические проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...