Timer - Vergleich von Zeiten

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
Bizkit83
User
Beiträge: 4
Registriert: Freitag 15. März 2013, 19:45

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
BlackJack

@Bizkit83: Schau Dir mal das `datetime`-Modul an.
Bizkit83
User
Beiträge: 4
Registriert: Freitag 15. März 2013, 19:45

Danke für den Tipp, aber leider komme ich damit nicht wirklich klar. Finde da nicht die richtige Methode/Funktion dazu.
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.
Bizkit83
User
Beiträge: 4
Registriert: Freitag 15. März 2013, 19:45

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 ........."
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_*`.
Antworten