Seite 1 von 1

Minuten aus Uhrzeiten berechnen

Verfasst: Dienstag 5. August 2008, 17:20
von troubl6
Hallo!
Bin Anfänger und würde gern aus zwei angegebenen Uhrzeiten (input: 16:30 und 18:30), die Minuten berechnen - also 120 Minuten. Wie könnte das gelöst werden?

Verfasst: Dienstag 5. August 2008, 17:41
von Andyh
Hallo

Code: Alles auswählen

zeit1 = 16.50
zeit2 = 18.50
div = (zeit2 - zeit1) *60
print div
Geht sicher noch besser, aber für den anfang.

Gruß
Andyh

Verfasst: Dienstag 5. August 2008, 17:58
von troubl6
Vielen Dank - es funktioniert - ABER wenn der User im Interface die Stunden und Minuten entsprechende der Konvention mit einem ":" trennt ergibt sich eine Fehlermeldung. :D

Verfasst: Dienstag 5. August 2008, 18:43
von lunar
http://docs.python.org/dev/library/datetime.html

Da stellt alles, was du wissen musst.

Verfasst: Dienstag 5. August 2008, 21:25
von troubl6
Wenn es für einen Anfänger so einfach wäre aus den Hilfe-Docs oder Büchern eine Antwort auf seine Frage zu bekommen, könnte man sich das Forum sparen! Leider helfen mir die 29 Seiten nicht wirklich weiter bei meinem Problem - es liegt sicher an mir :roll: aber wenn man beginnt sich mit dem programmieren zu beschäftigen und bestimmte Probleme für ein Projekt lösen möchte und noch nicht den Durchblick hat sind Meldungen wie Deine mein lieber "LUNAR" ziemlich entbehrlich!

Verfasst: Dienstag 5. August 2008, 21:44
von lunar

Code: Alles auswählen

>>> from datetime import datetime
>>> first_time = datetime.strptime('12:00', '%H:%M')
>>> second_time = datetime.strptime('11:30', '%H:%M')
>>> delta = first_time - second_time
>>> delta.seconds
1800
>>> delta.seconds / 60
30

Verfasst: Dienstag 5. August 2008, 21:53
von troubl6
Vielen Dank - und entschuldige meine vorherige Antwort - aber es erinnerte mich an meine alten Lehrer, die immer meinten "zuerst nachlesen" und dann meist keine weitere Antwort gaben (manche wussten vielleicht auch keine) und v.a. Ihre Erfahrung nicht weitergaben - ich bin ein Frischling was Programmierung betrifft und es ist leider in all den vielen Büchern und online-Hilfen nicht immer einfach Beispiele für anstehende Probleme zu finden.

Verfasst: Dienstag 5. August 2008, 22:21
von yipyip
Hallo troubl6,
hier eine fuer Dich vielleicht angemessenere
Problemloesung:

Code: Alles auswählen

t1 = '16:30'
t2 = '18:20'

def get_minutes(hm_string):
  
  hours, minutes = tuple(map(int, hm_string.split(':')))
  return hours * 60 + minutes

mdiff = get_minutes(t2) - get_minutes(t1)
print '%s - %s = %d' % (t2, t1, mdiff)


# etwas einsteigerfreundlicher:

def get_minutes_2(hm_string):

  hm_list = hm_string.split(':')
  hours = int(hm_list[0])
  minutes = int(hm_list[1])
  return hours * 60 + minutes

mdiff = get_minutes_2(t2) - get_minutes_2(t1)
print '%s - %s = %d' % (t2, t1, mdiff)
Nur damit du auf den Geschmack kommst...
:wink:
yipyip

Verfasst: Dienstag 5. August 2008, 22:46
von troubl6
zum Lösungsansatz von Lunar folgende Fehlermeldung:

first_time = datetime.strptime('12:00', '%H:%M')
AttributeError: type object 'datetime.datetime' has no attribute 'strptime'

zur Lösung von yipyip:

man muss nun die Zeit unter " " stellen sonst bekommt man eine Fehlermeldung. Abgesehen von einem Abfangen von Ausnahmen mit try - gibt es eine Lösung die eine unabhängige Usereingabe möglich macht - also egal ob der Dummy vor der Applikation "12:30", 12:30, 12.30 oder 1230 eingibt???

Verfasst: Dienstag 5. August 2008, 22:51
von HWK

Code: Alles auswählen

strptime( date_string, format) 

Return a datetime corresponding to date_string, parsed according to format.
This is equivalent to datetime(*(time.strptime(date_string, format)[0:6])). 
ValueError is raised if the date_string and format can't be parsed by 
time.strptime() or if it returns a value which isn't a time tuple. 
New in version 2.5. 
=> auf Python 2.5 updaten!
MfG
HWK

Verfasst: Mittwoch 6. August 2008, 05:51
von numerix
troubl6 hat geschrieben: Abgesehen von einem Abfangen von Ausnahmen mit try - gibt es eine Lösung die eine unabhängige Usereingabe möglich macht - also egal ob der Dummy vor der Applikation "12:30", 12:30, 12.30 oder 1230 eingibt???
Sicher. Aber zumindest die letzte Variante wirft Fragen auf:
Kann man sich darauf verlassen, dass der "Dummy" die Stunden und Minutenangaben immer zweistellig eingibt und ggf. mit Nullen auffüllt?
Ansonsten gäbe es z.B. bei 115 ein Problem: 11:05 Uhr oder 1:15 Uhr?

Geht man davon aus, dass er zumindest Minuten auffüllt, dann wäre 115 immer 1:15 Uhr und dann könnte man es auch so machen:

Code: Alles auswählen

t1 = "112"
t2 = "14:03"

def min(t):
    t = t.replace(".",":")
    if not ":" in t:
        t = t[:-2]+":"+t[-2:]
    h, min = map(int,t.split(":"))
    return h*60+min

print min(t2)-min(t1)

Verfasst: Mittwoch 6. August 2008, 07:48
von mkesper
Wenn er 115 eingibt, sollte das Programm einen Fehler anzeigen, dagegen aber : und . zulassen.
Mal so ganz banal gecodet:

Code: Alles auswählen

hhmm = '18:25'.split(':')
if len(hhmm) < 2:
    hhmm = hhmm.split('.')
if len(hhmm) < 2:
    print "Bitte eine gültige Uhrzeit eingeben (hh:mm oder hh.mm)."

Verfasst: Mittwoch 6. August 2008, 09:48
von lunar
In diesem Fall wäre dateutil.parser einen Blick wert.

Verfasst: Mittwoch 6. August 2008, 16:34
von birkenfeld
mkallas hat geschrieben: Mal so ganz banal gecodet:

Code: Alles auswählen

hhmm = '18:25'.split(':')
if len(hhmm) < 2:
    hhmm = hhmm.split('.')
if len(hhmm) < 2:
    print "Bitte eine gültige Uhrzeit eingeben (hh:mm oder hh.mm)."
Mal so ganz banal falsch :)

Verfasst: Mittwoch 6. August 2008, 18:25
von numerix
Meinst du das?

Code: Alles auswählen

>>> len(":".split(":"))
2

Verfasst: Mittwoch 6. August 2008, 18:30
von birkenfeld
Eher das:

Code: Alles auswählen

>>> [].split('.')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'split'

Verfasst: Mittwoch 13. August 2008, 11:59
von Y0Gi
Übrigens: Wenn man eine Zeitangabe in Minuten hat und daraus hh:mm machen möchte (analog für mm:ss), ist `divmod` eine schöne Sache:

Code: Alles auswählen

>>> minutes = 133
>>> '%sh %sm' % divmod(minutes, 60)
'2h 13m'