Seite 1 von 1

Timer - Vergleich von Zeiten

Verfasst: Freitag 15. März 2013, 19:50
von Bizkit83
Abend zusammen,

ich wollte mal wissen ob ihr vielleicht Erfahren gemacht habt mit einem Timer.
Ich lesen aus einer Datenbank 2 Zeiten aus.

Nun möchte ich eine Funktion haben, mit der ich prüfen kann ob die aktuelle Zeit zwischen diesen beiden Zeiten liegt.
Hat sowas schon mal jemand gemacht?

Code: Alles auswählen

tnow   = time.localtime()
tstart = time.strptime(str(row[3]),"%H:%M:%S")
tend   = time.strptime(str(row[4]),"%H:%M:%S")
Leider weiß ich nicht ob ich diesen Vergleich manuell machen muss oder ob es da was fertiges gibt.

Es muss nicht tagübergreifend funktionieren und nur Stunden und Minuten.

Gruß Simon

Re: Timer - Vergleich von Zeiten

Verfasst: Freitag 15. März 2013, 19:55
von BlackJack
@Bizkit83: Schau Dir mal das `datetime`-Modul an.

Re: Timer - Vergleich von Zeiten

Verfasst: Montag 18. März 2013, 11:07
von Bizkit83
Danke für den Tipp, aber leider komme ich damit nicht wirklich klar. Finde da nicht die richtige Methode/Funktion dazu.

Re: Timer - Vergleich von Zeiten

Verfasst: Montag 18. März 2013, 12:29
von BlackJack
@Bizkit83: Man erstellt `datetime.datetime`-Exemplare für die aktuelle Zeit (`now()`-Methode) und parsed die Zeichenketten in `datetime.datetime`-Exemplare (`strptime()`-Methode). Von denen lässt man sich jeweils den Zeitanzeil als `datetime.time`-Exemplar geben (`time()`-Methode) und vergleicht die Objekte.

Re: Timer - Vergleich von Zeiten

Verfasst: Montag 18. März 2013, 13:20
von Bizkit83
Habe es gelöst:

Code: Alles auswählen

tnow   = time.strptime((str(time.localtime().tm_hour)+":"+str(time.localtime().tm_min)+":"+str(time.localtime().tm_sec)),"%H:%M:%S")
tstart = time.strptime(str(row[3]),"%H:%M:%S")
tend   = time.strptime(str(row[4]),"%H:%M:%S")
        
if(tnow >= tstart) and (tnow < tend):       
     if(str(row[5])=="0"):
          mysql.update_timer(str(row[0]),"1")
          print "send ........."
else:
     if(str(row[5])=="1"):
          mysql.update_timer(str(row[0]),"0")
          print "send ........."

Re: Timer - Vergleich von Zeiten

Verfasst: Montag 18. März 2013, 13:50
von BlackJack
@Bizkit83: Das ist eine sehr unschöne, unleserliche Lösung, die zudem noch falsche Ergebnisse liefern könnte wenn verschiedenen `localtime()`-Aufrufe vor/nach ”Grenzen” erfolgen, also zum Beispiel einer in der 59 Minute und der nächste zur vollen Stunde.

Zahlen in Zeichenketten umwandeln um damit eine Zeichenkette zusammen zu basteln um das dann wieder in eine Zahl parsen ist verdammt umständlich und undurchsichtig.

Was sollen eigentlich die vielen `str()`-Aufrufe auf den SQL-Ergebnissen? Nicht das Du da schon `datetime.time`-Exemplare hast und das ganz *noch* umständlicher ist als es sein müsste! Wenn der Spaltentyp nämlich TIME ist, dann bekommst Du sehr wahrscheinlich schon `datetime.time`-Objekte geliefert.

Eine ähnliche Frage stellt sich bei ``row[5]`` — wozu ist die Umwandlung in `str` an dieser Stelle nötig?

Es würde ausserdem die Verständlichkeit steigern wenn man die einzelnen Elemente von `row` an Namen bindet und nicht über nichtssagende Indizes darauf zugreift.

Edit: Und ich hoffe mal ganz stark, dass `mysql.update()` keine Werte mit Zeichenkettenoperationen in SQL-Anweisungen hinein formatiert, sondern die Umwandlung dem Datenbankmodul überlässt.

Ungetestet:

Code: Alles auswählen

from datetime import datetime as DateTime

# ...

    some_value, _, _, start_time, end_time, some_other_value = row
    # 
    # Iff `start_time` and `end_time` *really* are strings,
    # convert them to `datetime.time` instances here.
    # 
    some_new_value = None
    if start_time <= DateTime.now().time() < end_time:
        if some_other_value == 0:
            some_new_value = 1
    else:
        if some_other_value == 1:
            some_new_value = 0
    if some_new_value is not None:
        mysql.update_timer(some_value, new_value)
        print 'send ...'
Natürlich mit passenderen Namen als `some_*`.