2015-07-08 10 views
10

ho un "leggibile" variabili hours, minutes, seconds, day, month, year che contiene i valori corrispondenti ai loro nomi (diciamo Ho la struttura SYSTEMTIME da <windows.h>).
L'unico modo che ho trovato per creare un chrono::time_point è:modo più elegante per combinare crono :: time_point da ore, minuti, secondi, ecc

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)); 

In primo luogo, ho perso un millisecondi da SYSTEMTIME.
Secondo, (mmm ...) Non mi piace questo tipo di conversione))

Potrebbe fornire un modo più elegante per risolvere questo problema?

+0

Se si dispone di un ** effettivo ** 'SYSTEMTIME', consultare' SystemTimeToFileTime() '. – MSalters

+0

@MSalters 'SystemTimeToFileTime()' mi dà un numero di intervalli di 100 nanosecondi dal 1 gennaio 1601, ma ho bisogno di 'chrono :: time_point' – borisbn

+0

True. Ma questo semplifica un po 'la matematica. Ottieni FILETIME e 'chrono :: time_point' per 1-1-2000 (per evitare problemi fuori intervallo - puoi farlo una volta), sottrai quel FILETIME dall'ora corrente, moltiplica per 10 per ottenere microsecondi e aggiungi quei microsecondi all'1-2-2000 time_point – MSalters

risposta

6

Utilizzando this open source, header-only library, posso:

#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'; 
} 

quali uscite:

2015-07-08 10:09:38.123000 

In "date.h", potrebbe essere necessario giocare con queste macro per ottenere le cose di compilare con VS .:

# define CONSTDATA const 
# define CONSTCD11 
# define CONSTCD14 

Con uno std conforme C++ 14 compilatore, queste macro devono essere impostati su:

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

Come può una libreria di sola intestazione in una lingua senza supporto di rete integrato occuparsi di secondi bisestili, la cui esistenza non è matematicamente prevedibile? In caso contrario, cosa fai con il salto di secondi? – Yakk

+3

@ Yakk: questa libreria non supporta i secondi bisestili. Tuttavia, ho quasi finito con un'altra libreria, su cui sono posizionati strati in cima a questa, che gestisce i secondi bisestili. Questa altra libreria non è solo intestazione ed è un parser completo del database del fuso orario IANA: http://www.iana.org/time-zones Il database IANA include i secondi bisestili nei suoi dati. Questa nuova libreria è completa, ma non ancora documentata. –

+0

Grande (est) biblioteca. Grazie. Potresti rimuovere 'using namespace' dalla risposta e riportarli a tutti i simboli per vedere quali simboli provengono dalla tua libreria e quali sono quelli da' chrono'? Grazie ancora – borisbn