C++ DateTime-Klasse
Habe ich meine eigene C++ DateTime
Klasse definiert als:
class DateTime
{
public:
int year;
int month;
int day;
int hour;
int min;
int sec;
int millisec;
};
Ich habe 2 DateTime
die ich brauche, um zu vergleichen, um zu sehen, welche größer ist als die (neueren) anderen.
Gibt es eine frei verfügbare C++ DateTime
Klasse, die ich verwenden können, um
- Konvertieren meiner DateTime-Klasse in Ihr DateTime-Klasse
- Ihrer Klasse bieten sollte, < , > , <= , >= - Operatoren für den Vergleich
Wenn ein konkretes Beispiel könnte vorgesehen werden, dass wäre toll. Beachten Sie, dass ich brauche, um zu vergleichen hinunter zu Millisekunden.
Ich dachte über Boost oder Qt. Bevorzugt Boost obwohl.
- Wenn Sie Ihre eigene Klasse, warum tun Sie müssen ein anderes?
- Oder noch wichtiger, wenn du gehst zu verwenden, für jemand anderen Klasse ist, warum verwenden es nur für Vergleiche? Verwenden Sie einfach Ihre Klasse. Die Arbeit ist für Sie erledigt. Graben Sie Ihre Klasse.
- Der Grund ist, weil meine Anwendung ist eine C++ - Bibliothek, die andere Anwendung zu nutzen. 1) ich dont wollen, dass Sie haben zu umfassen Boost-Bibliotheken für Sie zu machen verwenden von "meine Bibliothek". 2) Das DateTime-Klasse schon in vielen Orten des legacy-Systems. Danke für die Kommentare aber.
- Naja, das Rad neu erfinden ist schlecht:|, Wenn Sie verwenden können Sie Ihre Bibliothek, die Sie verwenden können, zu steigern.
- Yeah..ich Wünsche auch. Die Sache mit dem Boost ist, dass es sooo groß. so viele Ordner und die .lib-Dateien sind riesig (ich bin auf Windows). Das ist, warum ich nicht wollen, dass Sie beinhalten, zu Steigern.
- Auch Sie können extrahieren Sie den Ordner, den Sie brauchen, und die meisten sind-header 😐 Sie sein würde tun, Ihre Nutzer eine gute Sache, indem Sie
The Light
istBoost
. Ich werde jetzt aufhören 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehen Boost Date-Time-Bibliothek
Ihrer Klasse die sehr viel sieht aus wie struct tm
BEARBEITEN:
Du hast Recht, dass struct tm nicht unterstützt Millisekunden-Präzision.
Werfen Sie einen Blick auf eine Boost Beispiel. Hilft das?
Möchten Sie vielleicht check out QDateTime von Qt, die die benötigten Operatoren und ms Genauigkeit.
Konvertierung aus Ihrer Klasse getan werden könnte, über
Umgekehrt ist es ähnlich 😉
Ich weiß nicht, aus der Spitze von meinem Kopf. Aber ich würde überlegen, umschreiben Ihre date-Klasse zu halten, ein einziges 64-bit-integer Beschreibung von Millisekunden, die seit dem herkömmlichen Epoche (1970 ist es?). Dann sind Sie frei zu teilen Sie einfach durch 1000 und verwenden Sie die normalen CRT-Funktionen für die Formatierung als string, plus Sie können den Wert modulo 1000 um den Millisekunde Teil.
Vergleichsoperatoren werden dann einfach..
Ich Graben die Speicherung von Datumsangaben in Gregorianischen Alter vor.
Ich Speichere Daten, die als ein 32bit integer (in der Art, wie ein Julianisches Datum).
Also das Datum zusammengesetzt ist, als (Jahr * 1000) + DOY (DOY den Tag des Jahres).
I. e.
- 2009001 Jan 1 2009
- 2009365 ist Dez 31 2009
Mein date-Klasse der Kurs stellt die Methoden für das abrufen von Jahr, Monat und Tag, zu addieren, zu subtrahieren, Inkrementieren und Dekrementieren, im Vergleich, immer die Anzahl der Tage zwischen Terminen etc..
Für Datum und Zeit, die ich verwenden 64-bit-float, wo der ganzzahlige Anteil der reellen Zahl ist die gleiche wie integer (wie Julian) Termine oben beschrieben, und der Bruchteil stellt die Zeit dar, in der Fraktion von einem Tag.
I. e.
Wenn Sie nur die Minuten-Genauigkeit, können Sie mit 32bit float
für Datum und Zeit, aber Sie können nicht ausreichend genau
speichern, Sekunden und Millisekunden.
Die Vorteile der Speicherung von Daten (und Zeit) in dieser Weise sind:
Brauchen Sie nur 8bytes zur Darstellung der Daten und Zeit
im Vergleich zu 28bytes (vorausgesetzt 32bit-Ganzzahlen)
verwendet die DateTime-Klasse in Frage.
Vergleich mit gespeicherten Daten als Sekunden von einer Epoche,
beim Blick auf die Zahl (z.B. im debugger)
Sie können mehr oder weniger identifizieren von
die Zahl für das Jahr und der Tag des Jahres, und die Ungefähre Tageszeit
(um die Stunde, minute, Sekunde
nach Mitternacht einfach mulitply von 24, 1440, 86400 beziehungsweise).
Vergleich der Daten ist trivial, vergleichen Sie einfach die zahlen
(Ein single-CPU-Betrieb im Vergleich zu der mehrerer es
würde für das Beispiel DateTime).
Weniger Vergleichsoperationen zu tun, Datums-Arithmetik.
Den disadvange dieser (für die Zeit) ist zu einem geringen Verlust an Genauigkeit (dies ist praktisch ein mute-Punkt) und Sie haben zu tun, einige einfache Rundung, um schöne integer Werte, wenn convering ist auf ganzzahlige Werte von Stunden, Minuten und Sekunden.
Okay, hier der endgültige code-snippet, das beantwortet meine eigene Frage. Ich dachte, zu teilen, in diesem Fall ist es vielleicht hilfreich, um andere in der Zukunft. Dank Fred Larson für den Hinweis, den Boost Beispiel.
Wählte ich die Boost zu tun, die DateTime-Berechnung, weil meine Anwendung bereits nutzt Boost woanders. Ich denke, dass ich vielleicht in der Lage gewesen, Qt zu nutzen, wie gut, obwohl ich kann nicht ganz bestätigen.
Vorausgesetzt DateTime ist wie folgt definiert:
, Um einen einfachen DateTime-Vergleich
Hinzufügen 2 DateTime zusammen, um wieder eine neue DateTime -
Was ist falsch mit der Verwendung der Inhalte der
<time.h>
für die Umsetzung Ihrer Klasse? Es ist standard C90.#include <ctime>
GNU R benutzt einen struct-tm-Ersatz mit Mikrosekunden-Präzision -- statt (Ganzzahl) Sekunden seit Beginn der Epoche, es verwendet nun eine floating-point-Zahl. Das ist wirklich wirklich nützlich. Für viele meiner Anwendungen, die ich gerade letzten Doppel um und bekommen noch die Zeit-Konvertierungen.
Siehe R-2.9.1/src/main/datetime.c in der aktuellen R-Quellen.
Haben, die in einem eigenständigen C++ - Klasse wäre praktisch, wenn.
Anschauen
MFC-datetime-Klassen CTime und COleDateTime-Klassen
Mehr unter http://www.codeproject.com/KB/datetime/datetimedisc.aspx