Zeit-Differenz in hh:mm ausrechnen

Hallo,
alles int, StartZeit ist 06:32, Endzeit 20:00
Es geht nie über 00:00h, EndZeit ist immer größer.

ADaStd = 6;
[s]ADaMin = 23[/s] richtig: ADaMin = 32;

ADuStd = 20;
ADuMin = 0;

StartMin = ((ADaStd * 60) + ADaMin);// StartZeit in Min
EndMin = ((ADuStd * 60) + ADuMin);// EndZeit in Min

SoRMin = EndMin - StartMin; SoRMin = Differenz in Min

SoStd = SoRMin/60; // Std aus SoRMin
SoMin = SoRMin % 60; // Min aus SoRMin

print SoStd:SoMin // ist 13:28

geht das einfacher?
Gruß und Spaß
Andreas

SkobyMobil:
Hallo,
alles int, StartZeit ist 06:32, Endzeit 20:00
Es geht nie über 00:00h, EndZeit ist immer größer.

ADaStd = 6;

ADaMin = 23;

ADuStd = 20;
ADuMin = 0;

StartMin = ((ADaStd * 60) + ADaMin);// StartZeit in Min
EndMin = ((ADuStd * 60) + ADuMin);// EndZeit in Min

SoRMin = EndMin - StartMin; SoRMin = Differenz in Min

SoStd = SoRMin/60; // Std aus SoRMin
SoMin = SoRMin % 60; // Min aus SoRMin

print SoStd:SoMin // ist 13:28



geht das einfacher?

Einfacher? Oder mit korrekter Anfangszeit ?

Kann es sein, dass Du in Deiner Beispielrechnung die Anfangszeit 6:32 und 6:23 verwechselst?

Ich versuche mal eine Code-Alternative, bei der die Anfangszeit und Endzeit mit nur insgesamt zwei Integer-Variablen deklariert werden und trotzdem 'human readable' sind (2 Variablen finde ich einfacher als 4 Variablen).

int Anfangszeit =632;
int Endzeit=2000;

int DiffStd=(Endzeit/100-Anfangszeit/100);
int DiffMin=(Endzeit%100-Anfangszeit%100;
if (DiffMin<0) 
{
diffMin +=60;
diffStd-=1;
}

einfacher wüsste ich jetzt nicht, man kann es kompakter zusammenschreiben und bestimmt in eine Zeile packen, aber dan versteht es ja keiner mehr auf Anhieb.

Vielleicht in eine Funktion packen und irgendwo am Ende des Sourcecodes verstecken...
Einfacher geht meiner Meinung nach nicht, aber besLesbVarnam (besser lesbare Variablennamen) :slight_smile:

Wie wäre es wie folgt?

int ADaStd = 6;
int ADaMin = 23;
int ADuStd = 20;
int ADuMin = 0;
int SoStd, SoMin;

void setup() {
  if (ADaMin > ADuMin) {
    ADuStd--;
    ADuMin += 60;
  }
  SoStd = ADuStd - ADaStd;
  SoMin = ADuMin - ADaMin;
  Serial.begin(115200);
  Serial.print(F("Ergebnis "));
  Serial.print(SoStd);
  Serial.write(':');
  Serial.println(SoMin);
}
void loop() {}
Ergebnis 13:37

P.S. So würde ich das doch auch im Kopf machen, nicht erst alles in Minuten verwandeln...

Hallo,
"Anfangszeit 6:32" ja, danke geändert!

Also, richtig einfacher geht es wohl nicht. Vielleicht kompakter, das muß
aber nicht sein. 2 Variablen weniger ist nicht schlecht.

Die KopfArbeit läßt sich wohl einfacher verstehen, schau´n wir mal.

Probieren kann ich das erst später, mal sehen was mir mehr liegt.
Vielen Dank für eure Mühe.

"besser lesbare Variablennamen"

Mir ist jeder VariableName zu lang, ich hasse das.
ADaStd = Anfang-Dämmerung-Aufgang-Stunden

Gruß und Spaß
Andreas

Meine Methode ist kürzer, einfacher zu verstehen und wesentlich schneller (keine Multiplikationen oder Divisionen).

SkobyMobil:
Mir ist jeder VariableName zu lang, ich hasse das.
ADaStd = Anfang-Dämmerung-Aufgang-Stunden

Wenn Du das Ganze in eine Methode auslagerst, spielt es keine Rolle, ob dass das AnfangdämmerungsAufgangsStartzeitraumMinutenInverval ist oder startMin.

Die Methode wäre ja allgemeingültig und die Namen haben nichts mit dem Inhalt des Wertes zu tun, sondern ausschließlich deren Funktion :slight_smile:
Der Blick von oben/außen hilft oftmals die Benennung zu vereinfachen.

Interessant wäre natürlich noch wo die Uhrzeiten herkommen. Dann erübrigt sich vermutlich auch die Überlegung ob alles in eine Minuten-Variable oder separat in Stunden & Minuten aufgeteilt Sinn ergibt.
(Meine Glaskugel sagt mir, dass Du den Zeitraum noch mit der Aktuellen Uhrzeit vergleichen möchtest :smiley: )

Hallo,
so, ich habe es einmal betrachtet…
Die Version von Whandall ist auf einen Blick einfacher zu verstehen-
und sie funktioniert.

Die Version von Jurs funktioniert erst nach umfangreichen Änderungen-
und erschließt sich nicht so einfach auf den ersten Blick, was auch bestimmt
mit magelnder Intilligenz zu tun haben kann.

Man kann "PommesFritesMitMajonaiseundKetchup" tippen- kein Problem.
Ich tippe lieber "PommesRotWeis"

Das Namen nichts mit Werten zu tun haben müssen, ist mir bekannt.

Ich berechne in einer anderen Funktion den Sonnenauf- und Untergang, Azimut und
Elevation. Diese liefert Std & Min als int.

"Meine Glaskugel sagt mir..."
Ich habe mir einen waagerechten Bargraph erstellt, der mir darstellt:

Nacht nach Mitternacht, dunkelgrau
zivile Dämmerung in den Morgenstunden, hellgrau
Sonnenaufgang bis Sonnenuntergang, gelb
zivile Dämmerung in den Abendstunden, hellgrau
Nacht bis Mitternacht, dunkelgrau

Eine Markierung zeigt mir an, zu welcher Echtzeit die Sonne gerade steht.

Das habe ich grafisch gelöst, aber ich weiß nicht wie lang ein bestimmter
Abschnitt in hh:mm ist.

Ich kann sehen- wann die Sonne untergeht, aber nicht:
noch 03:22h bis Sonnenuntergang.

Wenn man auf diese Seite geht:

Sonnenstand

dann sieht man auf der Karte/Satellit eine Grafik mit Sonnenstand und
Schattenwurf- da soll es hingehen.

…Tuch auf Glaskugel.

Also, vielen Dank
Gruß und Spaß
Andreas

Hallo,
aber-

wenn man die Funktion von jurs betrachtet, und die umfangreichen Änderungen

DiffStd = (EndMin / 60 - StartMin / 60);
DiffMin = (EndMin % 60 - StartMin % 60);

if (DiffMin < 0)
{
DiffMin += 60;
DiffStd -= 1;
}

durchführt(ein Schelm, der da Böses denkt), dann stellt man fest-
das diese auch- mit Echtzeit, das richtige Ergebnis liefert.
Nicht schlecht.
Gruß und Spaß
Andreas

Hay,
aufbauend auf den Beitrag von Whandall habe ich jetzt versucht eine Funktion zu schrieben, welche auch den Umstand berücksichtigt, dass die Start- und Endzeit nicht vom selben Tag sind.

Whandall:
Wie wäre es wie folgt?

int ADaStd = 6;

int ADaMin = 23;
int ADuStd = 20;
int ADuMin = 0;
int SoStd, SoMin;

void setup() {
  if (ADaMin > ADuMin) {
    ADuStd--;
    ADuMin += 60;
  }
  SoStd = ADuStd - ADaStd;
  SoMin = ADuMin - ADaMin;
  Serial.begin(115200);
  Serial.print(F("Ergebnis "));
  Serial.print(SoStd);
  Serial.write(':');
  Serial.println(SoMin);
}
void loop() {}





Ergebnis 13:37



P.S. So würde ich das doch auch im Kopf machen, nicht erst alles in Minuten verwandeln...

Was sagt ihr dazu bzw. habt ihr Verbesserungsvorschläge?

int ADaStd = 22;
int ADaMin = 40;
int ADuStd = 3;
int ADuMin = 20;
int SoStd1, SoMin1 = 0;
int SoStd2, SoMin2 = 0;
int SoStd3, SoMin3 = 0;
int uebertrag = 0;


void setup() {
  int ADStd = 24;
  int ADMin = 0;
Serial.begin(115200);
  if (ADuStd < ADaStd)  {     //Wenn Endzeit < als Anfangszeit (->nächster Tag) berechne bis 00:00 (Step 1)
    if (ADaMin > ADMin) {
    ADStd--;
    ADMin += 60;
  }
  SoStd1 = ADStd - ADaStd;
  SoMin1 = ADMin - ADaMin;
  Serial.print(F("Ergebnis "));
  Serial.print(SoStd1);
  Serial.write(':');
  Serial.println(SoMin1);

  ADStd = 0;            //berechne von 00:00 bis Endzeit (Step 2)
  ADMin = 0;

  if (ADMin > ADuMin) {
    ADuStd--;
    ADuMin += 60;
  }
  SoStd2 = ADuStd - ADStd;
  SoMin2 = ADuMin - ADMin;
  Serial.print(F("Ergebnis "));
  Serial.print(SoStd2);
  Serial.write(':');
  Serial.println(SoMin2);
                                  //Step 3 = Step 1 + Step 2 (Step 3)
  if (SoMin1 + SoMin2 >60) {
    SoMin3= SoMin1 + SoMin2 -60;
    uebertrag =1;
  } else
  {
    SoMin3= SoMin1 + SoMin2;
  }
  SoStd3 = uebertrag + SoStd1 + SoStd2;
  Serial.print(SoStd3);
  Serial.write(':');
  Serial.println(SoMin3);
} else                            //Wenn Endzeit > Startzeit (-> gleicher Tag)
{
  
  if (ADaMin > ADuMin) {
    ADuStd--;
    ADuMin += 60;
  }
  SoStd3 = ADuStd - ADaStd;
  SoMin3 = ADuMin - ADaMin;
  Serial.print(F("Ergebnis "));
  Serial.print(SoStd3);
  Serial.write(':');
  Serial.println(SoMin3);
}

}

void loop() {}