Seite 1 von 1

Zeiterfassung/Arbeitszeitrechner

Verfasst: Montag 7. Oktober 2019, 13:23
von graaanityy
Hallo,

ich bin neu in diesem Forum und auch in Python ein "Newbie". Vor kurzem habe ich erst einen Kurs in CodeAca**** gemacht.

Nun möchte ich ein Programm schreiben, mit dem ich mir nach dem Arbeitszeitgesetz ausrechnen kann, wann ich Feierabend machen kann, ohne mit der Gleitzeit ins Minus zu rutschen.

Geplant hatte ich es so, dass man zuerst eine Uhrzeit OHNE Sekunden, also HH:MM eintippt, die dann berechnet und die Zeit ausgibt, zu der man gehen darf.


import time
now = time.strptime(raw_input("Geben Sie Ihre Ankunftszeit ein: "), "%H:%M")
print now
Mein erstes Problem bestand darin, die Uhrzeit aus einem String einzulesen. "strptime" soll hier Abhilfe schaffen, an sich tut es, was es soll, aber die Ausgabe ist, wie ihr unten sehen könnt, nicht wie gewünscht.

Geben Sie Ihre Ankunftszeit ein: 7:30
time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=7, tm_min=30, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1)
>>>
Ich habe noch keine Operatoren zum Berechnen verwendet, da ich erst einmal sehen möchte, ob das Einlesen der Zeit überhaupt funktioniert.

Erwartet habe ich jetzt, dass die Zeit so ausgegeben wird, wie sie eingegeben wurde, also, falls man beim Starten "7:30" eintippt wird

7:30
ausgegeben.

Wie kann ich die Zeit so strukturieren, dass sie wie oben angegeben, ausgegeben wird?

Ich möchte, so wie es im Forum ja auch gewünscht ist, freundlich darauf hinweisen, dass dieses "Projekt" keine Hausaufgabe oder sonstiges ist, sondern nur zu meiner eigenen Entwicklung in Python dient. :lol:

Danke im Voraus für die Hilfe :D

Re: Zeiterfassung/Arbeitszeitrechner

Verfasst: Montag 7. Oktober 2019, 14:16
von sparrow
Das sieht doch alles gut aus.
Wo ist denn dein konkretes Problem? strptime gibt ein time.struct_time Objekt zurück und das scheint ja korrekt bestückt zu sein.

Für den umgekehrten Weg nutze strftime

Re: Zeiterfassung/Arbeitszeitrechner

Verfasst: Montag 7. Oktober 2019, 14:21
von graaanityy
Mein Problem ist, dass die Zeit wie folgt ausgegeben wird

time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=7, tm_min=30, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1)

ich aber möchte, dass sie in dem Format ausgegeben wird, wie ich sie eingegeben habe, also

7:30

ausgegeben wird. Sobald das gelöst ist, ist mein nächster Schritt, die Operatoren zur Berechnung hinzuzufügen. Sprich zu der eingegebenen Zeit sollen 7,8 Stunden dazu addiert werden, damit wird dann die Zeit ausgegeben, in der die Arbeitszeit vorbei ist.

Re: Zeiterfassung/Arbeitszeitrechner

Verfasst: Montag 7. Oktober 2019, 15:13
von sparrow
Was du siehst ist die Repräsantion des time_struct Objektes. Wie ich schrieb: Das Gegenteil von strptime ist strftime. Schau dir das mal an.

Re: Zeiterfassung/Arbeitszeitrechner

Verfasst: Montag 7. Oktober 2019, 15:34
von __blackjack__
Wobei ich ja für Rechnungen mit Zeitangaben eher das `datetime`-Modul verwenden würde.

Re: Zeiterfassung/Arbeitszeitrechner

Verfasst: Dienstag 8. Oktober 2019, 08:27
von graaanityy
Ich habe mal folgendes probiert:

import time
eingabe = raw_input("Geben Sie Ihre Ankunftszeit ein: ")
eingabe_uhrzeit = time.strptime(eingabe,"%H:%M")
print time.strftime("%H:%M",eingabe_uhrzeit)

Damit ergibt sich die gewünschte Ausgabe, also so, wie es @sparrow erklärt hat.


__blackjack__ hat geschrieben: Montag 7. Oktober 2019, 15:34 Wobei ich ja für Rechnungen mit Zeitangaben eher das `datetime`-Modul verwenden würde.
Ich habe eigentlich nur time verwendet, da ich in diesem Programm ja ohne ein Datum arbeiten möchte.
Wenn ich datetime verwende, wie kann ich zu zu der eingegebenen Uhrzeit 7,8 Stunden dazu addieren?

Ich habe es damit probiert:
import datetime
eingabe = raw_input("Geben Sie Ihre Ankunftszeit ein: ")
eingabe_uhrzeit = datetime.strptime(eingabe,"%H:%M")
print datetime.strftime("%H:%M",eingabe_uhrzeit)+7,8
Aber dann bekomme ich nur den folgenden Fehler:
Traceback (most recent call last):
File "C:\Users\ry855\Desktop\timesheet.py", line 3, in <module>
eingabe_uhrzeit = datetime.strptime(eingabe,"%H:%M")
AttributeError: 'module' object has no attribute 'strptime'
Wie "formuliert" man das richtig?

Re: Zeiterfassung/Arbeitszeitrechner

Verfasst: Dienstag 8. Oktober 2019, 08:58
von graaanityy
Ich habe es nun mit datetime ausgeben können
from datetime import datetime
eingabe = raw_input("Geben Sie Ihre Ankunftszeit ein: ")
eingabe_uhrzeit = datetime.strptime(eingabe,"%H:%M")
print eingabe_uhrzeit.strftime("%H:%M")
Wenn ich nun 7,8 Stunden dazu addieren möchte, brauche ich dazu timedelta?

Re: Zeiterfassung/Arbeitszeitrechner

Verfasst: Dienstag 8. Oktober 2019, 09:03
von __deets__
Ja, timedelta ist das Mittel der Wahl.

Re: Zeiterfassung/Arbeitszeitrechner

Verfasst: Dienstag 8. Oktober 2019, 09:39
von Sirius3
Das `time`-Modul ist für die normale Benutzung zu low-level, datetime bietet alles, zum Rechnen mit Zeiten an. Du weißt, was 7,8 ist? Oder besser ausgedrückt, dass Du eigentlich ((datetime.strftime("%H:%M",eingabe_uhrzeit)+7), 8) das hier geschrieben hast?

Python2 sollte nicht mehr verwendet werden. Steige gleich auf Python3 um.

Re: Zeiterfassung/Arbeitszeitrechner

Verfasst: Dienstag 8. Oktober 2019, 09:47
von graaanityy
Ich habe es mittlerweile zum laufen bekommen, nun habe ich 8,3 Stunden dazu addiert.

Auf Python3 werde ich zeitnah noch umsteigen.

vielen Dank für Eure Hilfe!

Re: Zeiterfassung/Arbeitszeitrechner

Verfasst: Dienstag 8. Oktober 2019, 18:05
von sparrow
Steig lieber gleich auf Python 3 um. Es macht keinen Sinn jetzt noch mit Python 2 Projekte anzufangen.

Wie genau hast du es denn hinbekommen? Denn dein Codeschnipsel oben hat das von Sirius angesprochene Problem.

Re: Zeiterfassung/Arbeitszeitrechner

Verfasst: Donnerstag 10. Oktober 2019, 14:56
von graaanityy

from datetime import datetime, timedelta
while True:
try:
eingabe = input("Geben Sie Ihre Ankunftszeit im folgenden Format an: HH:MM: ")
stunde = eingabe[0:1:2]
minute = eingabe[3:5]

if int(stunde) < 0 or int(stunde) >= 24 or int(minute) < 0 or int(minute) >=60:
print("Fehlerhaftes Zeitformat.")

else:
val = float(stunde), float(minute)
eingabe_uhrzeit = datetime.strptime(eingabe,"%H:%M")
end_time = eingabe_uhrzeit + timedelta(hours=8.3)
end_time1 = eingabe_uhrzeit + timedelta(hours=10.75)
print("Ihre Mindestarbeitszeit endet um " + end_time.strftime("%H:%M"))
print("Ihre maximale zulässige Arbeitszeit endet um " + end_time1.strftime("%H:%M"))
except ValueError:
print("Geben Sie eine richtige Uhrzeit ein.")
Das ist der Code, den ich verwendet habe, um das Programm zum laufen zu bekommen.

Re: Zeiterfassung/Arbeitszeitrechner

Verfasst: Donnerstag 10. Oktober 2019, 16:13
von Sirius3
Warum nimmst Du nur die erste Ziffer der Stunde, um die Korrektheit zu überprüfen?
Die Prüfung an sich ist eh unnnötig, weil strptime sowieso prüft.

Wenn ich das richtig sehe, bist Du schon auf Python3 umgestiegen. Dann kannst Du auch gleich format-Strings benutzen:

Code: Alles auswählen

from datetime import datetime, timedelta
while True:
    eingabe = input("Geben Sie Ihre Ankunftszeit im folgenden Format an: HH:MM: ")
    try:
        uhrzeit = datetime.strptime(eingabe, "%H:%M")
    except ValueError:
        print("Geben Sie eine richtige Uhrzeit ein.")
    else:
        end_time = uhrzeit + timedelta(hours=8.3)
        end_time_maximal = uhrzeit + timedelta(hours=10.75)
        print(f"Ihre Mindestarbeitszeit endet um {end_time:%H:%M}")
        print(f"Ihre maximale zulässige Arbeitszeit endet um {end_time_maximal:%H:%M}")