如何在C ++中将unsigned int 64转换为时间?

时间:2017-05-07 15:03:18

标签: c++ datetime time c++-cli

我正在将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 ++时间对象的时间。

1 个答案:

答案 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,从而提高转化效率。