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
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.
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.
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.
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.
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.
> 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 !!!!!!
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
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.