2015-07-08 8 views
10

Ich habe ein „Menschen lesbares“ Variablen hours, minutes, seconds, day, month, year, die Werte entsprechend ihren Namen (sie enthält sagen Ich habe SYSTEMTIME Struktur von <windows.h>).
Der einzige Weg, ich chrono::time_point zu schaffen gefunden ist:eleganteste Weg chrono kombinieren :: time_point von Stunden, Minuten, Sekunden usw.

SYSTEMTIME sysTime = ...; // Came from some source (file, network, etc.) 
tm t; 
t.tm_sec = sysTime.wSecond; 
t.tm_min = sysTime.wMinute; 
t.tm_hour = sysTime.wHour; 
t.tm_mday = sysTime.wDay; 
t.tm_mon = sysTime.wMonth - 1; 
t.tm_year = sysTime.wYear - 1900; 
t.tm_isdst = 0; 
std::chrono::system_clock::time_point dateTime = 
    std::chrono::system_clock::from_time_t(mktime(& t)); 

Zuerst habe ich eine Millisekunden von SYSTEMTIME verloren.
Zweitens, (mmm ...) Ich mag diese Art der Konvertierung nicht))

Könnten Sie eine elegantere Möglichkeit geben, dieses Problem zu tun?

+0

Wenn Sie eine ** tatsächliche ** 'SYSTEMTIME' haben, siehe' SystemTimeToFileTime() '. – MSalters

+0

@MSalters 'SystemTimeToFileTime()' gibt mir eine Anzahl von 100-Nanosekunden-Intervallen seit dem 1. Januar 1601, aber ich brauche 'chrono :: time_point' – borisbn

+0

True. Aber das vereinfacht die Mathematik ein wenig. Erhalte FILETIME und 'chrono :: time_point' für 1-1-2000 (um out of range-Probleme zu verhindern - du kannst das einmal tun), subtrahiere diese FILETIME von der aktuellen Zeit, multipliziere mit 10 um Mikrosekunden zu erhalten, und füge diese Mikrosekunden hinzu zum 1-1-2000 time_point – MSalters

Antwort

6

Mit this open source, header-only library, ich kann:

#include "date.h" 
#include <iostream> 

struct SYSTEMTIME 
{ 
    int wMilliseconds; 
    int wSecond; 
    int wMinute; 
    int wHour; 
    int wDay; 
    int wMonth; 
    int wYear; 
}; 

int 
main() 
{ 
    SYSTEMTIME sysTime = {123, 38, 9, 10, 8, 7, 2015}; 
    std::chrono::system_clock::time_point dateTime = 
     date::sys_days(date::year(sysTime.wYear) 
         /date::month(sysTime.wMonth) 
         /date::day(sysTime.wDay)) 
     + std::chrono::hours(sysTime.wHour) 
     + std::chrono::minutes(sysTime.wMinute) 
     + std::chrono::seconds(sysTime.wSecond) 
     + std::chrono::milliseconds(sysTime.wMilliseconds); 
    std::cout << dateTime << '\n'; 
} 

die Ausgänge:

2015-07-08 10:09:38.123000 

In "date.h", können Sie mit diesem Makros spielen, um Dinge zu bekommen mit VS zu kompilieren .:

# define CONSTDATA const 
# define CONSTCD11 
# define CONSTCD14 

Mit einem std konformen C++ 14-Compiler, sollten diese Makros eingestellt werden:

# define CONSTDATA constexpr 
# define CONSTCD11 constexpr 
# define CONSTCD14 constexpr 
+0

Wie kann eine Header-Only-Bibliothek in einer Sprache ohne integrierte Netzwerkunterstützung mit Schaltsekunden umgehen, deren Existenz nicht mathematisch vorhersehbar ist? Wenn nicht, was machst du mit Schaltsekunden? – Yakk

+3

@Yakk: Diese Bibliothek unterstützt keine Schaltsekunden. Ich bin jedoch fast fertig mit einer anderen Bibliothek, die über diese Schicht hinausgeht, die Schaltsekunden behandelt. Diese andere Bibliothek ist nicht nur eine Kopfzeile und ist ein vollständiger Parser der IANA-Zeitzonendatenbank: http://www.iana.org/time-zones Die IANA-Datenbank enthält in ihren Daten Schaltsekunden. Diese neuere Bibliothek ist vollständig, aber noch nicht dokumentiert. –

+0

Große (est) Bibliothek. Vielen Dank. Könnten Sie 'using namespace' aus der Antwort entfernen und zu allen Symbolen zurückbringen, um zu sehen, welche Symbole aus Ihrer Bibliothek stammen und welche aus' chrono'? Vielen Dank noch – borisbn

Verwandte Themen