2017-05-07 517 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