2015-07-08 13 views
10

Ben değerler diyelim (isimlerinin tekabül içeren bir "Okunabilir" değişkenleri hours, minutes, seconds, day, month, year<windows.h>'dan SYSTEMTIME yapısına sahibim).
Bir chrono::time_point oluşturmak için bulunan tek yoludur:en zarif şekilde kronostratigrafik birleştirmek :: time_point saat, dakika, saniye vb den

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

Birincisi, SYSTEMTIME bir milisaniye kaybetti.
İkincisi, (mmm ...) Bu tür bir dönüşümü sevmiyorum))

Bu sorunu daha zarif bir şekilde verebilir misiniz? this open source, header-only library kullanma

+0

Eğer ** fiili ** 'SİSTEMTIME' varsa, bkz. 'SystemTimeToFileTime()'. – MSalters

+0

@MSalters 'SystemTimeToFileTime()', 1 Ocak 1601'den beri bana 100 nanosaniyelik aralıklarla bir aralık verir, ancak chrono :: time_point' – borisbn

+0

True'ye ihtiyacım var. Ama bu matematik biraz kolaylaştırır. 1-1-2000 için FILETIME ve 'chrono :: time_point' (aralık dışı sorunları önlemek için - bunu bir kez yapabilirsiniz), FILETIME öğesinin mevcut zamandan çıkarılması, 10 saniye ile mikrosaniye elde edilmesi ve bu mikrosaniyelerin eklenmesi 1-1-2000'e kadar time_point – MSalters

cevap

6

, yapabilirim:

2015-07-08 10:09:38.123000 

, VS ile derlemeye şeyler almak için bu makroları uğraşmak zorunda kalabilirsiniz "date.h" In: çıkışı

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

.:

bir std-uyumlu C++ 14 derleyici, bu makrolar ayarlanması gerekir ile
# define CONSTDATA const 
# define CONSTCD11 
# define CONSTCD14 

:

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

Yerleşik ağ desteği olmayan bir dilde yalnızca bir başlık kütüphanesi, varlığı matematiksel olarak öngörülebilir olmayan bir sıçrama saniye ile nasıl baş edebilir? Değilse, sıçrama saniye ile ne yaparsınız? – Yakk

+3

@Yakk: Bu kitaplık atlama saniyeini desteklemiyor. Ancak, neredeyse bir başka kütüphaneyle bitirdim, ki bu da bunun üzerine katlanarak saniyeler sürüyor. Bu diğer kitaplık yalnızca başlık değil ve IANA zaman dilimi veritabanının tam bir ayrıştırıcısıdır: http://www.iana.org/time-zones IANA veritabanı, verilerindeki saniye sayısını içerir. Bu yeni kütüphane tamamlandı ancak henüz belgelenmedi. –

+0

Harika (kütüphane). Teşekkür ederim. 'Namespace'i kullanarak cevaptan çıkarır mısınız ve kütüphaneden hangi sembollerin olduğunu ve' chrono 'dan hangileri olduğunu görmek için onları tüm sembollere geri getirebilir misiniz? Teşekkürler daha fazla – borisbn

İlgili konular