最初の質問。穏やかな。
私は、技術者がタスクに費やした時間を追跡するソフトウェアに取り組んでいます。ソフトウェアは、曜日と時間帯に基づいて異なる請求可能なレート乗数を認識するように拡張する必要があります。(例:「平日の午後5時から1時間半。」)
ソフトウェアを使用する技術者は、日付、開始時間、終了時間 (時間と分) を記録するだけです。ソフトウェアは、レート乗数が変化する境界で時間エントリを部分に分割することが期待されます。1 回のエントリーで複数日にまたがることはできません。
料金表の部分的なサンプルを次に示します。第 1 レベルの配列キーは明らかに曜日です。第 2 レベルの配列キーは、新しい乗数が有効になる時刻を表し、配列内の次の連続するエントリまで実行されます。配列の値は、その時間範囲の乗数です。
[rateTable] => Array
(
[Monday] => Array
(
[00:00:00] => 1.5
[08:00:00] => 1
[17:00:00] => 1.5
[23:59:59] => 1
)
[Tuesday] => Array
(
[00:00:00] => 1.5
[08:00:00] => 1
[17:00:00] => 1.5
[23:59:59] => 1
)
...
)
平易な英語では、これは午前 0 時から午前 8 時までは 1 時間半の料金、午後 8 時から午後 5 時までは通常の料金、午後 5 時から 11 時 59 分までは 1 時間半の料金を表します。これらの休憩が発生する時間は秒単位で任意である可能性があり、各日に任意の数の休憩が存在する可能性があります。(この形式は完全に交渉可能ですが、私の目標は、可能な限り人間が判読できるようにすることです。)
例として、月曜日の 15:00:00 (午後 3 時) から 21:00:00 (午後 9 時) に記録された時間エントリは、1x で請求される 2 時間と 1.5x で請求される 4 時間で構成されます。1 回のエントリが複数の休憩にまたがることも可能です。上記の rateTable の例を使用すると、午前 6 時から午後 9 時までの時間エントリには、午前 6 時から 8 時までの 1.5x、午前 8 時から午後 5 時までの 1x、午後 5 時から 9 時までの 1.5x の 3 つのサブ範囲があります。対照的に、時間エントリが 08:15:00 から 08:30:00 までのみであり、1 つの乗数の範囲に完全に含まれる可能性もあります。
曜日、開始時刻、終了時刻を取り、必要なサブパーツに解析できる PHP のコーディング (または少なくともアルゴリズムの考案) を実際に使用することができます。出力を (開始、停止、乗数) トリプレットの複数のエントリで構成される配列にすることが理想的です。上記の例の場合、出力は次のようになります。
[output] => Array
(
[0] => Array
(
[start] => 15:00:00
[stop] => 17:00:00
[multiplier] => 1
)
[1] => Array
(
[start] => 17:00:00
[stop] => 21:00:00
[multiplier] => 1.5
)
)
単一の(開始、停止)を(潜在的に)複数のサブパーツに分割するロジックに頭を悩ませることはできません。