Forum: Compiler & IDEs Uhrzeit vergleichen


von Markus P. (sebastianwurst)


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

von Karl H. (kbuchegg)


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.

von Helmut L. (helmi1)


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.

von Markus P. (sebastianwurst)


Lesenswert?

Ok super danke.

Noch eine andere Frage, ich habe die komplette Zeit auch jeweils als 
Long Wert:
1
Long_Uhrzeit = (rtc.time[0] * 100000UL) +  (rtc.time[1] * 10000UL) 
2
             + (rtc.time[3] * 1000UL) +  (rtc.time[4]* 100UL)
3
             + (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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

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

Nur dann ist eine Subtraktion dieser Werte sinnvoll.

von Karl H. (kbuchegg)


Lesenswert?

Sebastian K. schrieb:
> Ok super danke.
>
> Noch eine andere Frage, ich habe die komplette Zeit auch jeweils als
> Long Wert:
>
>
1
> 
2
> Long_Uhrzeit = (rtc.time[0] * 100000UL) +  (rtc.time[1] * 10000UL)
3
>              + (rtc.time[3] * 1000UL) +  (rtc.time[4]* 100UL)
4
>              + (rtc.time[6] * 10UL) +  (rtc.time[7] * 1UL);
5
>
>
> 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
1
   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.
1
  10:23:44   das sind   10 * 3600 + 23 * 60 + 44   -> 37400  Sekunden seit Mitternacht
2
  22:10:12   das sind   22 * 3600 + 10 * 60 + 12   -> 79812  Sekunden seit Mitternacht
3
4
   79812 - 37400  -> 42412
5
6
7
42412 Sekunden, das sind 706 Minuten und 52 Sekunden
8
   (42412 / 60 -> 706;  42412 % 60 -> 52)
9
   706 Minuten sind wiederrum 11 Stunden und 46 Minuten
10
   (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.

von Markus P. (sebastianwurst)


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 !!!!!!

von Markus P. (sebastianwurst)


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

von Karl H. (kbuchegg)


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.
1
Start   22:00:00
2
Endzeit 05:30:00
3
4
5
22*60*60 +  0*60 + 0  = 79200
6
 5*60*60 + 30*60 + 0  = 19800
7
8
19800 ist kleiner als 79200. Das kann aber nicht sein, da die Endzeit ja
9
größer als die Startzeit sein muss. Also ist da einmal Mitternacht mit
10
drinnen und das wird durch zusätzliche 86400 berücksichtig
11
12
19800 + 86400 -> 106200
13
14
Die Differenz ist also   106200 - 79200 = 27000
15
16
27000 / 60 = 450  + 0
17
450 / 60   =  7   + 30
18
19
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.

von Markus P. (sebastianwurst)


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 !!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.