www.mikrocontroller.net

Forum: Compiler & IDEs Uhrzeit vergleichen


Autor: Markus P. (sebastianwurst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe ein Problem und zwar möchte ich zwei Uhrzeiten vergleichen.

Ich habe jede Einheit in Integer so steht die Std, Min und Sek jeweils 
in einer Integer Variable

z.B.:
IstUhrzeitSek1 = (rtc.time[6] * 10) +  (rtc.time[7]); (z.B 10)
IstUhrzeitMin1 = (rtc.time[3] * 10) +  (rtc.time[4]); (z.B 10)
IstUhrzeitStd1 = (rtc.time[0] * 10) +  (rtc.time[1]); (z.B 20)

Dieses würde dann die Uhrzeit 10:10:20 (hh:mm:ss) ergeben. (Dies ist die 
aktuelle Uhrzeit)

Dann habe ich noch eine andere Uhrzeit die genau so Formatiert ist.

z.B.:

SollUhrzeitSek1 = 22; (z.B 22)
SollUhrzeitMin1 = 33; (z.B 33)
SollUhrzeitStd1 = 44; (z.B 44)

Dieses würde dann die Uhrzeit 22:33:44 ergeben.  (Dies ist eine 
Solluhrzeit mit der verglichen werden soll)

Wie kann ich jetzt am besten die beide Uhrzeiten vergleichen. So das ich 
nachher die Differenz der Uhrzeit anzeigen kann.
In diesem Fall: 12:38:24
                hh:mm:ss

Vielen Dank

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian K. schrieb:

> Wie kann ich jetzt am besten die beide Uhrzeiten vergleichen.

Am einfachsten geht es, wenn du dir die Anzahl der Sekunden seit 
Mitternacht für jede Zeit ausrechnest. Du hast dann keine lästigen 
Sonderfälle wenn die 60 in den Sekunden/Minuten überschritten werden.

Dann hast du nur 1 Zahl und musst nur darauf aufpassen, welche Uhrzeit 
die 'kleinere' ist, in dem Sinne dass sie früher stattfand.

Die Differenz zwischen 23:00:00 und 01:00:00 kann nun mal 2 Stunde sein 
oder 22 Stunden, je nachdem ob beide Zeiten am gleichen Tag aufgenommen 
wurden oder an darauffolgenden Tagen. Gegebenenfalls werden dann einfach 
zu einer der beiden Zeiten 86400 Sekunden (für einen ganzen Tag) 
dazugerechnet, ehe dann die kleinere von der größeren abgezogen wird.

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Normalerweise werden die Zeiten in Betriebssystemen wie UNIX , MS-DOS , 
Windows in Sekunden gezaehlt.

Bei Unix werden die Sekunden seite dem 1.1.1970 bei MS-DOS,Windows seit 
dem 1.1.1980 gezaehlt. Damit wird ein Zeitvergleich sehr einfach. Erst 
bei der Ausgabe werden diese Sekunden dann in HH:MM:SS umgerechnet. So 
wird nur bei der Ausgabe das umstaendliche (aus CPU sicht) Format 
benutzt. Also rechnest du erstmal alles nach Sekunden um dann kannst du 
den vergleich machen. Wenn du als Startzeitpunkt den 1.1.2000 waehlst 
hast du auch das Millenium Problem nicht. Wenn das Datum keine Rolle 
spielt geht es auch von 0.00 Uhr an.

Autor: Markus P. (sebastianwurst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok super danke.

Noch eine andere Frage, ich habe die komplette Zeit auch jeweils als 
Long Wert:

Long_Uhrzeit = (rtc.time[0] * 100000UL) +  (rtc.time[1] * 10000UL) 
             + (rtc.time[3] * 1000UL) +  (rtc.time[4]* 100UL)
             + (rtc.time[6] * 10UL) +  (rtc.time[7] * 1UL);

genau so habe ich auch die "Long_Soll_Uhrzeit"

Wenn jetzt:
Long_Uhrzeit : 123040
Long_Soll_Uhrzeit : 133050

Dann wäre die Subtraktion 10010
Also 1 Sunde, 0 Minuten und 10 Sekunden.
Aber wie kann ich ein Long Werte so aufbröseln das ich bestimme kann das 
die letzen beiden Ziffern die Sekunden. Ziffer 2und 3 die min usw. sind?

Dann bräucht ich das umrechenn in ms nicht mehr machen.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieser "Long-Wert" ist kein iota besser geeignet für die Berechnung von 
Zeitdifferenzen als die Einzelwerte.

Das sollte so aussehen:
Long_Uhrzeit = rtc.time[0] * 36000L 
             + rtc.time[1] * 3600L
             + rtc.time[3] * 600L 
             + rtc.time[4] * 60L
             + rtc.time[6] * 10L 
             + (long int) rtc.time[7];

Nur dann ist eine Subtraktion dieser Werte sinnvoll.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian K. schrieb:
> Ok super danke.
>
> Noch eine andere Frage, ich habe die komplette Zeit auch jeweils als
> Long Wert:
>
>
> 
> Long_Uhrzeit = (rtc.time[0] * 100000UL) +  (rtc.time[1] * 10000UL)
>              + (rtc.time[3] * 1000UL) +  (rtc.time[4]* 100UL)
>              + (rtc.time[6] * 10UL) +  (rtc.time[7] * 1UL);
> 
>
> genau so habe ich auch die "Long_Soll_Uhrzeit"
>
> Wenn jetzt:
> Long_Uhrzeit : 123040
> Long_Soll_Uhrzeit : 133050
>
> Dann wäre die Subtraktion 10010
> Also 1 Sunde, 0 Minuten und 10 Sekunden.

Das bringt dir alles nicht viel.
Du hast immer noch die Sonderfälle bei 60
Rechne doch mal

  133040 - 123050

knifflig.

Was ist so schwer daran:
Eine Minute hat 60 Sekunden
Eine Stunde hat 60 Minuten

Also sind seit Mitternacht vergangen
   Stunden * 60 * 60 + Minuten * 60 + Sekunden
Und jetzt hast du eine Zahl, die sauber von 0 bis 86400 an einem Tag 
durchläuft. Jede Sekunde wird die Zahl um genau 1 erhöht. Ohne 
Sonderfälle oder sonstige Spezialitäten. Kein Minutenübertrag, kein 
Stundenübertrag.
  10:23:44   das sind   10 * 3600 + 23 * 60 + 44   -> 37400  Sekunden seit Mitternacht
  22:10:12   das sind   22 * 3600 + 10 * 60 + 12   -> 79812  Sekunden seit Mitternacht

   79812 - 37400  -> 42412


42412 Sekunden, das sind 706 Minuten und 52 Sekunden
   (42412 / 60 -> 706;  42412 % 60 -> 52)
   706 Minuten sind wiederrum 11 Stunden und 46 Minuten
   (706 / 60 -> 11; 706 % 60 -> 46)
Also ist die Differenz zwischen 22:10:12 und 10:23:44 genau 11:46:52

> Aber wie kann ich ein Long Werte so aufbröseln das ich bestimme kann das
> die letzen beiden Ziffern die Sekunden. Ziffer 2und 3 die min usw. sind?

  123 / 10 -> 12
  123 % 10 -> 3

/ ist die Division. % ist der Rest bei einer Division.

> Dann bräucht ich das umrechenn in ms nicht mehr machen.

Dafür machst du dir einen Haufen Mehrarbeit, bei der Differenzbildung.
(und jetzt weißt du auch warum man Zeiten Rechnerintern meistens nicht 
in Stunden, Minuten, Sekunden speichert. Das ist nämlich zum Rechnen 
beschissen. Eine fortlaufende Sekundenzählung ist zum Rechnen viel 
einfacher und bei Bedarf ist es eine Kleinigkeit, sich daraus wieder 
eine Stunden:Minuten:Sekunden Zahl zu bauen.

Autor: Markus P. (sebastianwurst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>   10:10:20   das sind   10 * 3600 + 10 * 60 + 20   -> 36620  Sekunden
> seit Mitternacht
>   22:33:44   das sind   22 * 3600 + 33 * 60 + 44   -> 81224  Sekunden
> seit Mitternacht
>    81224 - 36620  -> 44604
> 44604 Sekunden, das sind 743 Minuten und 24 Sekunden
>    (44604 / 60 -> 743;  44604 % 60 -> 24)
>    743 Minuten sind wiederrum 12 Stunden und 23 Minuten
>    (743 / 60 -> 12; 743 % 60 -> 23)
> [/code]
> Also ist die Differenz zwischen 22:33:44 und 10:10:20 genau  12:23:24



So werde ich es machen. Vielen Dank !!!!!!

Autor: Markus P. (sebastianwurst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl Heinz wie würdest Du denn jetzt bei dir den Mitternachtsfall 
einbauen. So läuft deine Theorie ja super und machte mir auch einiges 
klar. Jedoch habe ich auch den Fall das die Startzeit 22:00:00 Uhr ist 
und die Endzeit 05:30:00. Da wäre die Differenz ja jetzt 07:30:00.
Auch mit vergleich und dann 86400 Sekunden dazu addieren ?
Das ist bei mir nicht so einfach, zu mindest habe ich es noch nicht hin 
bekommen. Dachte vielleicht hast du noch ne einfachere Lösung. Hab an 
das Startdatum gedacht.?!?!? Wüste aber jetzt auch nicht wie ich das 
integrieren kann.

mfg Sebi

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian K. schrieb:
> Karl Heinz wie würdest Du denn jetzt bei dir den Mitternachtsfall
> einbauen. So läuft deine Theorie ja super und machte mir auch einiges
> klar. Jedoch habe ich auch den Fall das die Startzeit 22:00:00 Uhr ist
> und die Endzeit 05:30:00.

am nächsten Tag?

> Da wäre die Differenz ja jetzt 07:30:00.
> Auch mit vergleich und dann 86400 Sekunden dazu addieren ?

Genau

> Das ist bei mir nicht so einfach,

warum nicht?

> zu mindest habe ich es noch nicht hin
> bekommen. Dachte vielleicht hast du noch ne einfachere Lösung. Hab an
> das Startdatum gedacht.?!?!? Wüste aber jetzt auch nicht wie ich das
> integrieren kann.

Wenn du 2 Zeiten hast

  Z1  und  Z2

und du weißt, dass Z2 auf jeden Fall später als Z1 sein muss, dann muss 
zu Z2 noch 1 ganzer Tag (86400) Sekunden addiert werden, wenn Z2 
numerisch kleiner als Z1 ist.

Genaus das machst du ja im täglichen Leben auch. Die Differenz von 3 Uhr 
früh zu 23 Uhr am Vortag ist nun mal 4 Stunden ( ( 3+24) - 23 ) und 
nicht 20 Stunden.
Start   22:00:00
Endzeit 05:30:00


22*60*60 +  0*60 + 0  = 79200
 5*60*60 + 30*60 + 0  = 19800

19800 ist kleiner als 79200. Das kann aber nicht sein, da die Endzeit ja
größer als die Startzeit sein muss. Also ist da einmal Mitternacht mit
drinnen und das wird durch zusätzliche 86400 berücksichtig

19800 + 86400 -> 106200

Die Differenz ist also   106200 - 79200 = 27000

27000 / 60 = 450  + 0
450 / 60   =  7   + 30

also   7:30:00  Differenz

Problematisch ist nur der Fall, wenn die Startzeit Sonntag 17:00:00 
lautet und die Endzeit auf Montag 19:22:00 kommt.
Dann hast du 1 Tag dazwischen, der in der Berechnung nicht 
berücksichtigt ist. Aber solange deine Differenzen nie größer als 24 
Stunden sind, ist es immer eindeutig.

Autor: Markus P. (sebastianwurst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Problematisch ist nur der Fall, wenn die Startzeit Sonntag 17:00:00
> lautet und die Endzeit auf Montag 19:22:00 kommt.
> Dann hast du 1 Tag dazwischen, der in der Berechnung nicht
> berücksichtigt ist. Aber solange deine Differenzen nie größer als 24
> Stunden sind, ist es immer eindeutig.

Dieses Problem habe ich zum Glück nicht... Den Rest kriege ich auch noch 
hin. Vielen Dank Karl. TopFit !!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.