MicroPython: Zeit-Differenzen berechnen

Wenn man Datum und Uhrzeit verarbeiten muss, dann geht es häufig auch darum, die Differenz zwischen zwei Daten oder Zeiten ist berechnen. Das Problem dabei, Datum und Uhrzeit folgen keinem einheitlichen Maß, sondern sind unterschiedlich. So hat eine Minute 60 Sekunden und eine Stunde 60 Minuten. Aber ein Tag hat 24 Stunden und eine Woche 7 Tage. Am Krassesten sind die Monate, die je nach Monat unterschiedliche viel Tage haben. Und ein Monat hat sogar alle 4 Jahre einen Tag mehr. Wenn man dann noch die Differenz in einem bestimmten Maß haben möchte, wird es beliebig kompliziert.

Es gibt eine Lösung dafür: Das Rechnen mit Zeitstempeln. Das heißt man arbeitet innerhalb des Programmcodes nicht mit den einzelnen dezimalen Werten des Datums oder Uhrzeit, sondern definiert eine dezimale Zahl von einem definierten Startpunkt aus. Nur zur Darstellung wird in die Dezimalzahl in ein Datum oder Uhrzeit umgerechnet.

Zeitstempel

Ein Zeitstempel ist in der Regel eine Ganzzahl und repräsentiert die Anzahl der Sekunden, die von einem bestimmten Zeitpunkt aus vergangen sind. Echtzeituhren (RTC) zählen also die Sekunden bzw. führen einen Zähler, der jede Sekunde um den Wert von 1 steigt. Verfügt ein System über eine Echtzeituhr, kann man die Anzahl der Sekunden auslesen.
Damit man die aktuelle Uhrzeit erhält, muss man Wissen (Betriebssystem, Programmiersprache, Programmierer), von welchem Datum/Uhrzeit aus die Sekunden gezählt wurden. Zeitsysteme, Betriebssysteme und Echtzeituhren haben dazu eine individuelle Startzeit der Zeitrechnung.

  • NTP: ab dem 1.1.1900 00:00:00
  • Unix/Linux: ab dem 1.1.1970 00:00:00
  • MicroPython: ab dem 1.1.2000 00:00:00

Rechnen mit Zeitstempel

Zeitstempel haben verschiedene Vorteile. Zum Beispiel beim Speichern von Datum und Uhrzeit. Man benötigt kein kompliziertes Datenformat, sondern hat es nur mit einer langen Ganzzahl zu tun, die sich einfach in eine binäre Zahl umwandeln und speichern lässt. Wenn man Zeitdifferenzen berechnen will, dann reicht es aus, die Anzahl der Sekunden die vergangen sind oder die vergehen werden, hinzuzuaddieren und dann den Wert in das lesbare Format umzuwandeln, in das man Datum und Uhrzeit darstellen will.

Typische Werte sind:

  • 1 Minute: 60 Sekunden
  • 1 Stunde: 3.600 Sekunden (60 Sekunden x 60 Minuten)
  • 1 Tag: 86.400 Sekunden (60 Sekunden x 60 Minuten x 24 Stunden)
  • 1 Woche 604.800 Sekunden (60 Sekunden x 60 Minuten x 24 Stunden x 7 Tage)
  • 1 Jahr: 31.536.000 Sekunden (60 Sekunden x 60 Minuten x 24 Stunden x 365 Tage)

Hierbei besteht die Schwierigkeit, dass manche Zeiteinheiten, wie zum Beispiel der Monat, keine definierte Länge hat. Zum Beispiel hat der Februar 28 Tage, der März 31 Tage usw. Erschwerend kommen Schaltjahre hinzu, bei denen der Februar 29 Tage hat.

Beispiel: Differenz zwischen zwei Uhrzeiten in Stunden, Minuten und Sekunden

Hier ist eine Funktion in MicroPython, die die Differenz zwischen zwei Uhrzeiten unter Berücksichtigung von Stunden, Minuten und Sekunden berechnet:

def diff_time(start_time, end_time):
    # Umwandeln von Stunden, Minuten und Sekunden in Sekunden
    start_seconds = (start_time[0] * 3600) + (start_time[1] * 60) + start_time[2]
    end_seconds = (end_time[0] * 3600) + (end_time[1] * 60) + end_time[2]
		
		# Berechnen der Zeitdifferenz in Sekunden
    diff_seconds = end_seconds - start_seconds
		
		# Umwandeln der Zeitdifferenz in Stunden, Minuten und Sekunden
    diff_hours = diff_seconds // 3600
    diff_minutes = (diff_seconds % 3600) // 60
    diff_seconds = diff_seconds % 60
    
		# Rückgabe der Zeitdifferenz
    return (diff_hours, diff_minutes, diff_seconds)

start_time = (9, 30, 0) # 9:30:00 Uhr
end_time = (14, 15, 45) # 14:15:45 Uhr

diff = diff_time(start_time, end_time)
print(diff)

Die Funktion „diff_time“ erwartet zwei Argumente in Form von Tupeln, wobei jedes Tupel die Stunden, Minuten und Sekunden der jeweiligen Uhrzeit enthält.
Die Funktion „diff_time“ wandelt die Uhrzeiten zuerst in die Anzahl der Sekunden um. Anschließend wird die Zeit-Differenz in Sekunde berechnet und dieser Wert in Stunden, Minuten und Sekunden zurück gerechnet.

Beispiel: Differenz zwischen zwei Datumsangaben in Tagen berechnen

Hier ist eine Funktion in MicroPython, die die Differenz zwischen zwei Datumsangaben in Tagen berechnet:

import time

def days_diff(d1, d2):
    d1 += (1, 0, 0, 0, 0)
    d2 += (1, 0, 0, 0, 0)
    return time.mktime(d2) // (24*3600) - time.mktime(d1) // (24*3600)

date1 = (2023, 1, 1)
date2 = (2023, 2, 28)
print(days_diff(date1, date2))

Die Funktion „diff_days“ ergänzt das Datum zuerst um die Angaben von Stunden, Minuten und Sekunden, damit der Datensatz zum Umrechnen in Sekunden vollständig ist. Anschließend wird die Zeit-Differenz in Sekunden und dabei in Tage umgerechnet.

Anwendungen mit Datum und Uhrzeit

Weitere verwandte Themen:

Frag Elektronik-Kompendium.de

Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython

Elektronik-Set Pico Edition

Das Elektronik-Set Pico Edition ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.

  • LED: Einschalten, ausschalten, blinken und Helligkeit steuern
  • Taster: Entprellen und Zustände anzeigen
  • LED mit Taster einschalten und ausschalten
  • Ampel- und Lauflicht-Steuerung
  • Elektronischer Würfel
  • Eigene Steuerungen programmieren

Elektronik-Set jetzt bestellen Online-Workshop buchen

Online-Workshop: Programmieren mit dem Raspberry Pi Pico

Programmieren mit dem Raspberry Pi Pico

Gemeinsam mit anderen und unter Anleitung experimentieren? Wir bieten unterschiedliche Online-Workshops zum Raspberry Pi Pico und MicroPython an. Einführung in die Programmierung, Sensoren programmieren und kalibrieren, sowie Internet of Things und Smart Home über WLAN und MQTT.

Online-Workshop buchen

Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.

Termine und Newsletter-Anmeldung

 

Elektronik-Sets für das Hardware-nahe Programmieren