Betriebstundenzähler

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
juntiedt
User
Beiträge: 10
Registriert: Dienstag 13. Dezember 2016, 16:22

Ich habe folgenden Betriebsstundenzähler am Laufen:

Code: Alles auswählen

import threading
import time
import datetime
#import Calendar

class betriebsstundenzaehler():

    def __init__(self):
        #now = datetime.datetime.now()
        #if isleap(now.year):
        #    self.s_year = 31622400  #366*24*60*60
        #else:
        self.year = 31536000  #365*24*60*60 
        self.day = 86400      #24*60*60
        self.hour = 3600      #60*60
        self.minute = 60
        self.start = time.time()
        self.now = self.start
        self._bsz_thread = threading.Thread(target=self._run_zaehler)
        self._bsz_thread.daemon = True  # Don't let this thread block exiting.
        self._bsz_thread.start()

    def _run_zaehler(self):
        while True:
            self.now = time.time()
            time.sleep(1)
            
    def get_run_time_sec(self):
        return (self.now - self.start) 
        
    def get_run_time_str(self):
        delay = (self.now - self.start)
        tr = delay/self.year
        year = int(tr)
        delay = delay - year*self.year
        tr = delay/self.day
        day = int(tr)
        delay = delay - day*self.day
        tr = delay/self.minute
        minute = int(tr))
        delay = delay - minute*self.minute
        sec = int(round(delay,0)) 
        out = "{:0>3d}".format(year) + ":" + "{:0>2d}".format(day) + ":" + "{:0>2d}".format(minute) + ":" +  "{:0>2d}".format(sec)
        return out
        
#-----------------------------------------------------------------------

BSZ = betriebsstundenzaehler()
while True:
    print(str(BSZ.get_run_time_sec()))
    print(BSZ.get_run_time_str())
    time.sleep(5)

ich frage mich ob man die Funktion get_run_time_str() mit timedelta und strftime nicht kürzer schreiben und schneller ausführbar machen kann?
Hat jemand einen Tipp?
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@juntiedt: es ist doch ziemlich umständlich, achtstellige Zahlen auszuschreiben und, da man sonst vergisst, woher die Zahl kommt, die Formel als Kommentar dahinter zu schreiben. Konstanten werden üblicherweise komplett in Großbuchstaben als Klassenattribute geschrieben. Was ich auch noch nie gesehen habe, ist ein Thread, der nur dazu da ist, die aktuelle Uhrzeit in ein Attribut zu schreiben; die Uhr läuft eh im Hintergrund. Was Du für Deine Berechnungen in get_run_time_str brauchst ist der Modulo-Operator % oder gleich divmod, das Divisionen und Rest berechnet. Warum Du Jahre, Tage, Minuten und Sekunden ausgibst, ist mir rätselhaft, Jahre sind, wie Du selbst schon gemerkt hast, nicht eindeutig und Stunden sind auch keine unübliche Einheit. Zahlen mit führenden Nullen formatiert man mit "{:03d}" und der Formatstring umfasst dann den ganzen String, statt einzelne Teilstücke mit + zusammenzustückeln. Klassen schreibt man groß, Variablen dagegen komplett und ohne kryptische Abkürzungen:

Code: Alles auswählen

import time
from datetime import datetime as DateTime
 
class Betriebsstundenzaehler():
    def __init__(self):
        self.start = DateTime.now()
 
    def get_run_time(self):
        return DateTime.now() - self.start
 
    def get_run_time_sec(self):
        return self.get_run_time().total_seconds()
       
    def get_run_time_str(self):
        delay = self.get_run_time()
        minutes, seconds = divmod(delay.seconds, 60)
        hours, minutes = divmod(minutes, 60)
        return "{:d}:{:02d}:{:02d}:{:02d}".format(delay.days, hours, minutes, seconds)

betriebsstundenzaehler = Betriebsstundenzaehler()
while True:
    print(betriebsstundenzaehler.get_run_time_sec())
    print(betriebsstundenzaehler.get_run_time_str())
    time.sleep(5)
juntiedt
User
Beiträge: 10
Registriert: Dienstag 13. Dezember 2016, 16:22

Hallo Sirius,
danke für Dein Skript. Ich habe immer nach so was wie divmod im Internet gesucht aber leider nicht gefunden. Das Skript bestätigt wieder meine Erfahrung, dass ein Profi mindestens 100 mal produktiver ist wie ein Hobbyprogrammierer :wink: Ich hab schon viel von dir gelernt!
Hannes
juntiedt
User
Beiträge: 10
Registriert: Dienstag 13. Dezember 2016, 16:22

Code: Alles auswählen

import time
from datetime import datetime as DateTime
from dateutil.relativedelta import relativedelta
 
class Betriebsstundenzaehler():
    def __init__(self):
        self.start = DateTime.now()

    def get_run_time_str(self):
        diff = relativedelta(DateTime.now(), self.start)
        return "{:d}:{:03d}:{:02d}:{:02d}:{:02d}:{:02d}".format(diff.years, diff.months, diff.days, diff.hours, diff.minutes, diff.seconds)
#
#------------------------------------------------------------------------------------------------------------------------------------------
#
betriebsstundenzaehler = Betriebsstundenzaehler()
while True:
    print(betriebsstundenzaehler.get_run_time_str())
    time.sleep(5)
mit Hilfe von dateutil ist der BSZ jetzt noch kürzer.
Antworten