我正在将CLI C ++代码转换为标准C ++,并且我有一段代码可以获取UINT64号码(来自远程服务器 - 因此我无法更改为我获得的格式/精度)并将其转换进入DateTime对象,然后输出以下值:myDatetime.ToString(“dd / MM / yyyy hh:mm:ss.fffffff tt”)。 我还没有找到一种方法将unsigned int 64转换为C ++中的时间。 以下代码对于如此大的数字没有任何作用(这是我从服务器获得的64位数字)。
time_t rawtime=131274907755873979
localtime_s(&timeinfo, &rawtime);
我需要一些帮助:)
我的问题在线程Convert Epoch Time string to Time中没有回答,因为它不适用于我需要的数字。例如,我从服务器获得的数字131274907755873979。该值的函数ctime只返回NULL。 我需要一种方法来转换我作为无符号int64到标准C ++时间对象的时间。
答案 0 :(得分: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 ns)的持续时间。然后只计算两个时期之间的偏移量并从输入中减去它,并形成std::chrono::time_point
。现在,您可以根据需要格式化time_point
。
上述程序输出:
29/12/2016 03:12:55.5873979 PM
如果您使用VS 2017,您将能够offset
constexpr
,从而提高转化效率。