Zeiterfassung/Arbeitszeitrechner

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
graaanityy
User
Beiträge: 6
Registriert: Montag 7. Oktober 2019, 13:03

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
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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
graaanityy
User
Beiträge: 6
Registriert: Montag 7. Oktober 2019, 13:03

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.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei ich ja für Rechnungen mit Zeitangaben eher das `datetime`-Modul verwenden würde.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
graaanityy
User
Beiträge: 6
Registriert: Montag 7. Oktober 2019, 13:03

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?
graaanityy
User
Beiträge: 6
Registriert: Montag 7. Oktober 2019, 13:03

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?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja, timedelta ist das Mittel der Wahl.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
graaanityy
User
Beiträge: 6
Registriert: Montag 7. Oktober 2019, 13:03

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!
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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.
graaanityy
User
Beiträge: 6
Registriert: Montag 7. Oktober 2019, 13:03


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.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

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}")
Antworten