2017-05-07 516 views
-1

我將CLI C++代碼轉換爲標準C++,並且我有一段代碼可以獲取UINT64數字(來自遠程服務器 - 所以我無法更改爲我獲得的時間的格式/精度)並將其轉換爲DateTime對象和更高版本輸出以下值:myDatetime.ToString(「dd/MM/yyyy hh:mm:ss.fffffff tt」)。 我還沒有找到一種方法來在C++中將unsigned int 64轉換爲時間。 下面的代碼對數字如此之大(這是我從服務器獲得的64位數字)沒有做任何事情。如何在C++中將unsigned int 64轉換爲時間?

time_t rawtime=131274907755873979 
localtime_s(&timeinfo, &rawtime); 

我需要一些幫助:)

我的問題wan't回答線程Convert Epoch Time string to Time,因爲它不換號一樣大的工作,因爲我需要。例如,號碼131274907755873979這是我從服務器獲得的。該值的函數ctime僅返回NULL。 我需要一種方法來將我作爲unsigned int64得到的時間轉換爲標準C++時間對象。

+1

將[Epoch Time字符串轉換爲時間]的可能重複(http://stackoverflow.com/questions/14792658/convert-epoch-time-string-to-time) – RoiHatam

+0

您不認爲該轉換數字轉換成DateTime對象可能與問題相關的一點點,你呢? –

+0

關於「標準C++時間對象」。 C++ 11或更新近的可接受標準? – user4581301

回答

0

您還沒有告訴我們現有的代碼如何將該數字轉換爲DateTime。讓我們假設它通過調用這個構造函數來實現:DateTime(long long ticks)

the documentation of that constructor of DateTime

長長蜱在自0001年1月1起已經過00的100毫微秒間隔數表示日期和時間:00:00.000公曆。

在另一方面,根據the documentation of localtime_sthe documentation of time_tlocaltime_s()需要

自00:00的秒(不計算閏秒)數,1970年1月1日UTC。

所以,你首先需要100納秒的時間間隔轉換成秒,然後將從0001年1月1,1月1日,1970年

+0

它目前的工作方式是使用DateTime :: FromFileTime函數將unsigned int64轉換爲DateTime對象。 – primeQuestion

+0

根據[FromFileTime **的文檔](https://msdn.microsoft.com/en-us/library/system.datetime.fromfiletime(v = vs.110).aspx) –

+0

,同樣的事情做你的意思是:「所以,你首先需要將100納秒的間隔轉換爲秒,然後從0001年1月1日轉換爲1970年1月1日」 - 我該如何做這種轉換? – primeQuestion

0

使用Howard Hinnant's datetime library這種計算可以很容易地完成。它適用於VS 2013及更高版本。

#include "tz.h" 
#include <cstdint> 
#include <string> 
#include <iostream> 

std::string 
FILETIME_to_string(std::uint64_t i) 
{ 
    using namespace std; 
    using namespace std::chrono; 
    using namespace date; 
    using FileTime = duration<int64_t, ratio<1, 10000000>>; 
    auto const offset = sys_days{jan/1/1970} - sys_days{jan/1/1601}; 
    auto tp = sys_days{jan/1/1970} + (FileTime{static_cast<int64_t>(i)} - offset); 
    return format("%d/%m/%Y %I:%M:%S %p", make_zoned("Etc/GMT-2", tp)); 
} 

int 
main() 
{ 
    std::cout << FILETIME_to_string(131274907755873979) << '\n'; 
} 

此跳過DateTime並徑直向string。我不確定你想要的格式是tt。但不管它是什麼,都可以處理。

此庫建立在C++ 11 <chrono>庫上。所以首先要做的是創建一個持續時間來表示窗口大小(100納秒)。然後計算兩個曆元之間的偏移量,並從輸入中減去它,並形成一個std::chrono::time_point。現在,您可以根據需要格式化time_point

上述程序的輸出:

29/12/2016 03:12:55.5873979 PM 

如果你使用VS 2017年,你就可以做出offsetconstexpr,使轉換效率更高。

+0

非常感謝。但我的工作不允許使用第三方庫。是否有可能通過chrono庫中的內容來做到這一點? – primeQuestion

+0

@primeQuestion:是的,我的整個圖書館都建立在''之上。您需要計算兩個曆元日期之間「0.1微秒」的數量,將其從輸入中減去,然後將其轉換爲「{年,月,日,小時,分鐘,秒,小數秒}」數據結構,然後格式化它。這裏有一個日曆公式的紙幫助你:http://howardhinnant.github.io/date_algorithms.html –

+0

謝謝。爲什麼使用jan/1/1601作爲Windows的epoh日期? 0001年1月1日00:00:00.000是不是? – primeQuestion