C ++ DateTime-Klasse

8

Ich habe meine eigene C ++ DateTime Klasse definiert als:

%Vor%

Ich habe 2 DateTime , die ich vergleichen muss, um zu sehen, welche größer als die (neuere) die andere ist.

Gibt es eine frei verfügbare C ++ DateTime Klasse, die ich benutzen kann

  1. Konvertiere meine DateTime-Klasse in ihre DateTime-Klasse
  2. Ihre Klasse sollte & lt; , & gt; , & lt; =, & gt; = Operatoren zum Vergleich

Wenn ein konkretes Beispiel zur Verfügung gestellt werden könnte, wäre das großartig. Beachten Sie, dass ich bis Millisekunde vergleichen muss.

Ich habe an Boost oder Qt gedacht. Bevorzugter Boost obwohl.

    
sivabudh 12.08.2009, 16:22
quelle

8 Antworten

18

Siehe Boost-Date-Time-Bibliothek

Und Ihre Klasse sieht struct tm

sehr ähnlich

BEARBEITEN: Sie haben Recht, dass struct tm keine Millisekunden-Genauigkeit unterstützt.

Sehen Sie sich ein Boost-Beispiel . Hilft das?

    
Fred Larson 12.08.2009, 16:27
quelle
8

Sie können QDateTime von Qt mit den erforderlichen Operatoren und ms-Genauigkeit auschecken.

Die Konvertierung von Ihrer Klasse könnte über

erfolgen %Vor%

Der umgekehrte Weg ist ähnlich :-)

    
hirschhornsalz 12.08.2009 16:51
quelle
5

Ich weiß nichts von meinem Kopf. Aber ich würde in Betracht ziehen, Ihre Date-Klasse neu zu schreiben, um eine einzelne 64-Bit-Ganzzahl zu speichern, die Millisekunden seit der konventionellen Epoche beschreibt (1970 ist es das?). Dann können Sie einfach durch 1000 teilen und verwenden Sie die normalen CRT-Funktionen für die Formatierung als Zeichenfolge, und Sie können den Wert Modulo 1000 nehmen, um den Millisekunden-Teil zu erhalten.

Vergleichsoperatoren werden dann einfach ..

    
pauldoo 12.08.2009 16:30
quelle
4

Okay, hier ist das letzte Code-Snippet, das meine eigene Frage beantwortet. Ich dachte daran, dies zu teilen, falls es für andere Leute in der Zukunft hilfreich sein könnte. Danke an Fred Larson für das Zeigen des Boost-Beispiels.

Ich habe Boost gewählt, um die DateTime Berechnung durchzuführen, weil meine Anwendung Boost woanders bereits nutzt. Ich denke, dass ich auch Qt hätte benutzen können, obwohl ich das nicht vollständig bestätigen kann.

Angenommen, DateTime ist definiert als:

%Vor%

Einen einfachen DateTime-Vergleich durchführen

%Vor%

Hinzufügen von 2 DateTime, um eine neue DateTime zurückzugeben

%Vor%     
sivabudh 12.08.2009 22:06
quelle
4

Ich speichere Daten in gregorianischen Zeiten. Ich speichere Daten als eine 32-Bit-Ganzzahl (eine Art wie ein julianisches Datum). Also das Datum ist zusammengesetzt als (Jahr * 1000) + DOY (DOY ist der Tag des Jahres). I.e. - 2009001 Ist der 1. Januar 2009 - 2009365 ist der 31. Dezember 2009

Meine Datumsklasse bietet natürlich Methoden zum Abrufen von Jahr, Monat und Tag, Addieren, Subtrahieren, Inkrementieren und Dekrementieren, Vergleichen, Abrufen der Anzahl von Tagen zwischen Daten usw ..

Für Datum und Uhrzeit verwende ich 64-Bit-Gleitkommazahl, wobei der ganzzahlige Teil der reellen Zahl mit den oben beschriebenen ganzzahligen (Julian-ähnlichen) Daten übereinstimmt und der Bruch die Zeit im Bruchteil eines Tages darstellt.

i.e.

  • 2009001.04166666666 ~ ist der 1. Januar 2009 1:00 Uhr
  • 2009001.06249999999 ~ ist der 1. Januar 2009 1:30 Uhr
  • 2009001.95833333333 ~ ist der 1. Januar 2009, 23.00 Uhr

Wenn Sie nur winzige Genauigkeit benötigen, können Sie 32-Bit-Float verwenden Für Datum und Uhrzeit kann man aber nicht ausreichend genau Speichere Sekunden und Millisekunden.

Die Vorteile des Speicherns von Daten (und Zeit) auf diese Weise sind:

  • Sie benötigen nur 8 Bytes, um die Daten und die Zeit darzustellen verglichen mit 28 Bytes (unter der Annahme von 32-Bit-Ganzzahlen) Wird von der DateTime-Klasse in der Frage verwendet.

  • Verglichen mit Daten, die als Sekunden aus einer Epoche gespeichert sind, wenn man sich die Nummer anschaut (zB im Debugger) Sie können sich mehr oder weniger identifizieren die Nummer das Jahr und der Tag des Jahres und die ungefähre Tageszeit (um die Stunde, Minute, Sekunde zu bekommen nach Mitternacht einfach multiply um 24, 1440, 86400 bzw.).

  • Vergleichen von Daten ist trivial, vergleichen Sie einfach die Zahlen (Eine einzelne CPU-Operation im Vergleich zu den anderen es würde für das Beispiel DateTime nehmen).

  • Weniger Vergleichsoperationen für die Datenarithmetik.

Der Nachteil davon (für die Zeit) ist ein leichter Verlust der Genauigkeit (dies ist praktisch ein Mute-Punkt) und Sie müssen einige einfache Runden tun, um schöne ganzzahlige Werte zu erhalten, wenn Sie ganzzahlige Werte von Stunden Minuten und Sekunden umrechnen.

    
Roger Nelson 13.08.2009 03:44
quelle
2

Was ist falsch daran, den Inhalt von <time.h> für die Implementierung Ihrer Klasse zu verwenden? Es ist Standard C90.

    
AProgrammer 12.08.2009 16:27
quelle
1

GNU R verwendet einen Struktur-tm-Ersatz mit Mikrosekunden-Genauigkeit - anstelle von (ganzen) Sekunden seit der Epoche verwendet er nun eine Gleitkommazahl. Das ist wirklich sehr nützlich. Für viele meiner Anwendungen habe ich mich einfach verdoppelt und trotzdem die Zeitkonvertierungen bekommen. Siehe R-2.9.1 / src / main / datetime.c in den aktuellen R-Quellen.

Das in einer eigenständigen C ++ - Klasse zu haben, wäre jedoch praktisch.

    
Dirk Eddelbuettel 12.08.2009 16:52
quelle
0

Schau dir an MFC-Datetime-Klassen CTime- und COleDateTime-Klassen Mehr unter Ссылка

    
Learner 12.08.2009 16:30
quelle

Tags und Links