5倍速!メールマガジン
外部アカウントで登録
受講生の声
新着の講座投稿
新着の講座コメント
新着のノート投稿
投稿一覧へ新着のノートコメント
表示できる投稿はありません。
サイト運営者紹介
小川 慶一講師/教材/システム開発者紹介
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
表示できる投稿はありません。
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
たかちゃんさんの投稿
(投稿ID: 5356)
小川 慶一さんのコメント
(コメントID: 7711)
インターフェイスが command line ですが、ウェブブラウザから入力するようになったら、ちょっとしたツールにとして使えそうですね (^^
小川 慶一さんのコメント
(コメントID: 7758)
単純に、以下の感じで良いのかなとも思うのですが、どうでしょう。
朝5時以降も勤務が続いた分についても計算し直すならば、以下で、変数 midnight_duration の値から引き算する感じです。
似たような処理になるので、関数を作ってそこで処理を抽象化すれば洗練されたコードになるかと。
たかちゃんさんのコメント
(コメントID: 7783)
すみません、本日気づきました。m(_ _)m
工事会社ではよくあるパターンの計算でして、
作業時間は2時間だったりすることも・・・・(短)日中・深夜関係なく工事が行われるので結構複雑です。(><)
因みに、作業時間が何時間だろうが一定額のお給料は支給されますが、作業時間は別に記録しておくシステムとなっています。
深夜手当時間だけは、22:00-5:00に働いた分が別途支給です。
頂いたアドバイスを元に、簡素化してみました。
また、プログラム書き終わった所で投稿します。(^^;)
If 22:00<=開始時間<=5:00 and 22:00<=終了時間<= 5:00の場合
深夜手当時間=終了時間-開始時間(②、③、④)
Elseif 開始時間>終了時間
深夜手当時間=6:00(⑥)
If 開始時間<22:00 and 22:00<= 終了時間<=0:00の間の場合(①)
深夜手当=終了時間-22:00
Else
0:00<= 開始時間<= 5:00 and 終了時間>5:00の場合(⑤)
深夜手当=5:00-開始時間
ーーーー
ルール:
・時間は30分単位
・勤務時間が6時間以上になったら、休憩時間1時間分ひく。
・深夜手当が支給される時間は、22:00〜5:00に働いた時間。(但し、最大で6時間分までの支給。)
・8時間超えた分は残業時間。
深夜勤務のパターン
①21:00〜22:30(深夜手当時間:0:30)
②22:00〜22:30(深夜手当時間:0:30)
③22:30〜4:30(深夜手当時間:5:00)
④1:00〜4:30(深夜手当時間:3:30)
⑤4:30〜7:00(深夜手当時間:0:30)
⑥21:00〜9:00(深夜手当時間:6:00)
ーーーー
たかちゃんさんのコメント
(コメントID: 7784)
あとは、関数を使ってまとめれば良さそうです・・・。
はまった箇所:
①深夜手当時間の計算で、「22:00-0:00」と「0:00-5:00」を分けて考えていたのですが、datetimeには日付データもある為
分けて考える必要がなかった事。(単純に、終了時刻-開始時刻の引き算で良い。)
②duration = datetime.strptime("6:00", '%H:%M').time() 最後に、「.time()」を付けると時刻のみ表示される事。
ややこしくて申し訳ないですが、記念に投稿させて下さい。(T T)
小川 慶一さんのコメント
(コメントID: 7785)
関数等使ってプラッシュアップしたものを作ったら、またアップしてください。
僕も、いただいたコードをいろいろ手直ししてみました。
そのときに、僕の書いたコードをお見せしたいと思います (^^
小川 慶一さんのコメント
(コメントID: 7786)
以下のサンプルのような感じで。
ref: https://peps.python.org/pep-0008/#module-level-dunder-names
たかちゃんさんのコメント
(コメントID: 7787)
docstringの件もありがとうございます。
完成後、再び投稿します。
たかちゃんさんのコメント
(コメントID: 7791)
「深夜勤務日付調整」と「深夜手当時間IF文」の2箇所で関数を作成しました。
ポイント:
①def check_dateでは、値を2つ関数に渡して、結果を2つ受け取っています。
結果はタプルになって受け取る事が分かりました。
②以下の条件で、深夜手当時間が6:00以上になった場合は、6:00を返すように
記述を変更しました。(前回までは、マイナス1:00時間としていた。)
<条件>
②開始時間は22:00以前、終了時間が[22:00-5:00内]の場合
③開始時間は[22:00-5:00内]、終了時間が5:00以降の場合
小川 慶一さんのコメント
(コメントID: 7795)
以下については、配慮していません。
>②以下の条件で、深夜手当時間が6:00以上になった場合は、6:00を返すように
> 記述を変更しました。(前回までは、マイナス1:00時間としていた。)
> <条件>
> ②開始時間は22:00以前、終了時間が[22:00-5:00内]の場合
> ③開始時間は[22:00-5:00内]、終了時間が5:00以降の場合
ところで、「作業終了時間は翌日のお昼を超える事はない」ということですが、「勤務時間の開始と終了は深夜で深夜勤務時間が6時間を超える」という状況がありえるのでしょうか。
あるとしたら、1:00-23:00, 2:00-24:00, 3:00-25:00, 4:00-26:00 等が相当しますが。
これらがありえないのであれば、条件分岐はそんなに難しくなさそう。
あと、単純に深夜勤務手当の最大値は 6:00 ということであれば、いったん深夜の実労働時間を計算して、それと 6:00 とを比較して大きい方を取るとか。
以下では、定数や関数は別モジュールに置いて import で呼び出したほうがスッキリするかなと思います。
そろそろ、モジュールとインポート文の話をきちんとするべきかなと思ってます。あと、テストコードの書き方を。
たかちゃんさんのコメント
(コメントID: 7797)
コードを拝見しました。
頭に叩き込むには少し時間がかかりそうですが、写経して少しづ習得したいと思います。
本当にありがとうございます。m(_ _)m
特に、以下がとても参考になりました。自分でコードを書いていた時は、どこかの条件が抜けていそうな混乱した状態でした。
①各処理は、関数で設定。
②複雑な評価の場合は、
BEFORE_MID、WITHIN_MID、 AFTER_MIDと評価基準を作成しておく。
③判定する値も複数ある場合は、
まずは、1つ(開始時間)の評価をIF文で書いて、その隙間に、2つ目(終了時間)の判定し処理を書く。
④get_midnight_work_hoursの処理の中で、get_labor_hours_typeを呼び出していましたが
このような動きが可能だという事に気づきました。
ーーー
>ところで、「作業終了時間は翌日のお昼を超える事はない」ということですが、「勤務時間の開始と終了は深夜で深夜勤務時間が6時間を超え
>る」という状況がありえるのでしょうか。
>あるとしたら、1:00-23:00, 2:00-24:00, 3:00-25:00, 4:00-26:00 等が相当しますが。
>これらがありえないのであれば、条件分岐はそんなに難しくなさそう。
8月1日 1:00a.m. 〜8月2日21:00p.m.のパターンでしょうか。
このような状況はありません。
作業時間が長くても、12-13時間程度で以下のような感じです。
8月1日(16:00p.m.)開始し、8月2日(4:00a.m)に終了
8月1日(21:00p.m.)開始し、8月2日(8:00.a.m.)に終了
色々、ありがとうございます。m(_ _)m
ーーー