DateDiff - Differenz zwischen zwei Daten

Hallo,

ich bin auf der Suche nach einer Möglichkeit, die die Differenz zwischen 2 Daten errechnet. Dabei sollen idealerweise Schalttage und Schaltsekunden berücksichtigt werden. Aus der Python-Welt kenne ich die DateDiff aber meine Suche in der C/C++-Welt brachte diesbezüglich keinen Erfolg.

Ich habe mir (wie vieler Orts im Internet empfohlen) mit der Umrechnung auf Unix Zeitstempel und deren Subtraktion beholfen. Dabei sind aber die Schalttage / -Sekunden unberücksichtigt. Dementsprechend passen meine Ergebnisse nicht. Natürlich kann man auch diese auslesen und in die Berechnung einfließen lassen aber das scheint mir eine Art Hilfskrücke zu werden. Geht das auch eleganter?

Muster (stark vereinfacht zur Anschaulichkeit):

DateTime1 = "2017-03-17 10:30:15"
DateTimeNow = Unix Zeitstempel
DateTime2 = "2027-03-17 10:30:15"

Idealerweise kann man zwischen 2 festen Daten (DateTime1/DateTime2) im Format "yyyy-mm-dd / h:mm:ss" berechnen lassen oder sogar von DateTime1 zu DateTimeNow (Vergangenheit) bzw. von DateTimeNow zur DateTime2 (Zukunft)

Gibt es da eine Lösung?

Das schliesst sich aus.

Bei den Tagen ist das nicht so problematisch, da es dafür ne Formel gibt.
Aber SS?

dafür gibt es difftime
[url]https://www.cplusplus.com/reference/ctime/difftime/[/url]

#include "time.h"    // https://www.cplusplus.com/reference/ctime/difftime/
void setup() {
  Serial.begin(115200);

  uint32_t from = 1582844400;          // 2020-02-28
  uint32_t to = 1583017200;            // 2020-03-01
  uint32_t diff = difftime(to, from);
  Serial.println(diff);
}

void loop() {}

172800

stimmt meines erachtens weils ein Schaltjahr war.

Warum gibt es Schaltsekunden?: "Schaltsekunden orientieren sich an der Rotationsgeschwindigkeit der Erde. Da diese schwankt, werden auch Schaltsekunden in unregelmäßigen Abständen eingefügt."

Offensichtlich läßt sich die Erdrotation nicht genau vorhersagen, weshalb eine Berücksichtigung von Schaltsekunden in der Zukunft nicht möglich ist.

Was willst Du mir sagen?
Ich schrieb doch "das schliesst sich aus"

Es gibt Schaltsekunden!

Da habe ich Deine Aussage wohl gänzlich mißverstanden :thinking:

Das bestreite ich nicht.
Weisst Du, wann in der Zukunft eine eingefügt wird?
Denn nur um die Zulkunftsfunktion geht es. :innocent:

Hallo noiasca,

eine elegante Lösung. So habe ich es mir im Grunde vorgestellt. Bei mir kommt jedoch "0" raus. Was mache ich falsch?

Vermutlich ein Programmierfehler in Zeile 42.

Forumregeln lesen und anwenden.

Angeregt durch #8:

Bei mir kommt da der 27.2. und am oberen Ende der 29.2. raus. :wink:
Der UnixTimeRechner rechnet die Timezone zusätzlich mit ein.

@Formidabel Die Rechnung stimmt aber. Der Unterschied ist ja die Angabe in sekunden...

Sorry, ich habe die Rechnung noch mal nachvollzogen und gegen gecheckt. Die Daten passen in der Tat. Die Schaltjahre werden entgegen meiner ersten Annahme berücksichtig. Danke für den kleinen Schubser in die richtige Richtung :slight_smile:

In der Realität schon, bei deinen Zeitberechnungen aber nicht. In Unixtime hat ein Tag immer 86400 Sekunden.

Die Schaltsekunden sind ja für die Vergangenheit bekannt...
Nur wenn Du im Februar 2022 nachsehen willst, was im September 2025 ist, wirds schlecht :wink:

... interessieren aber keinen.

... und die Uhrzeit wird immer (irgendwann) von :59 auf :00 umspringen.

Schalttage sind ein anderes Thema, solange sie sich an die definierten Regeln halten.

Offensichtlich nicht.

Ich habe noch eine Nachfrage: Wenn ich nun die richtige Differenz aus den Timestamps ermittelt habe, ist die Umrechnung insbesondere bei langen Zeiträumen in Jahr/Monat/Tag ja immer noch ein Problem. Nach welcher Formel (Stichwort Schaltjahre) muss hier umgerechnet werden, um die korrekten Zeitabständen zu ermitteln?

Muster (stark vereinfacht zur Anschaulichkeit):

Datum1 -> Umwandlung Timestamp1
Datum2 -> Umwandlung Timestamp2
Umwandlung Timestamp1 - Umwandlung Timestamp2 = TimestampDifferenz
TimestampDifferenz -> gesuchte Formel (Format YY:MM:DD)

bitte mach einen kompilierbaren Sketch.
Was hast du an Input Daten
Was erwartest du als Ergebnis
Was bekommst du statt dessen.

Zu 99% bin ich davon überzeugt dass deine Antwort auf die Frage in der time.h nachgelesen werden kann.

Und ich zu 99% das nicht.
Die Frage ist:
Ich habe ein Startdatum. Ich habe ein Enddatum
Ich will die Angabe in Jahr(e)/Monat(e)/Tag(e) der abgelaufenen Zeit.
Unter Berücksichtigung des Startdatum; Weil unter Berücksichtigung der Schalttage, die in der Ablaufzeit anfallen.
Also muss ich schon ein wenig selbst Formel bauen....

Ja, es läuft auf Formel bauen raus, denn so einfach umrechnen scheint nicht möglich. Schade, ich hatte gehofft, dass das durch eine Lib geregelt werden kann. Bei all dem wundere ich mich jedoch, dass es dafür noch keine Lösung zu geben scheint (wo doch sonst fast alles im Netz zu finden ist). Ich kann doch nicht der erste mit diesem Problem sein?!

Den las ich mal unkommentiert...
:slightly_smiling_face:

1 Like