C++ 如何从std::tm转换为Windows::Foundation::DateTime

C++ 如何从std::tm转换为Windows::Foundation::DateTime,c++,windows-runtime,C++,Windows Runtime,我正在尝试在Windows运行时组件中将std::tm转换为Windows::Foundation::DateTime Windows::Foundation::DateTime中唯一的属性是UniversalTime,定义为: 一个64位有符号整数表示一个时间点,即1601年1月1日午夜之前或之后的100纳秒间隔数(根据公历) 是否有办法在std中获取此值?或者有没有标准的转换方法 您可以使用mktime将时间转换为unix, 然后添加幻数1164444736000000000ull:

我正在尝试在Windows运行时组件中将
std::tm
转换为
Windows::Foundation::DateTime

Windows::Foundation::DateTime
中唯一的属性是
UniversalTime
,定义为:

一个64位有符号整数表示一个时间点,即1601年1月1日午夜之前或之后的100纳秒间隔数(根据公历)


是否有办法在
std
中获取此值?或者有没有标准的转换方法

您可以使用
mktime
将时间转换为unix, 然后添加幻数
1164444736000000000ull

    /* shift is difference between 1970-Jan-01 & 1601-Jan-01
    * in 100-nanosecond intervals */
    const uint64_t shift = 116444736000000000ULL; // (27111902 << 32) + 3577643008
/*班次是1970-01年1月和1601-01年1月之间的差异
*以100纳秒的间隔*/

常数uint64\u t shift=1164444736000000000ull;//(27111902这里是推导该常数的另一种方法,但需要它来序列化两个公历日期:

#include "date.h"

int
main()
{
    using namespace std::chrono;
    using namespace date;
    using namespace std;
    using wticks = ratio_multiply<nano, ratio<100>>;
    constexpr duration<int64_t, wticks> t =
                          sys_days{jan/1/1970} - sys_days{jan/1/1601};
    static_assert(t.count() == 116444736000000000, "");
}
这只是我的输出:

130925235970000000

谢谢!我正在查看上的文档,但我没有看到它提到mktime的返回值是从何时开始的。这是否总是安全的使用?请看,它在所有系统上都没有明确的保证,但至少在windows和unix之类的操作系统上,它应该正常工作,例如,请看,当然,您可以使用boost date_time来关注platform Independencythanks!我正在查看上的文档,但我没有看到它提到mktime的返回值是从何时开始的。使用此常量是否总是安全的?
time\u t
mtkime
的返回是对时间点的未指定编码。通常它以秒为精度跟踪Unix时间。这是一个自1970-01-01 UTC以来的非闰秒数。在某些系统上,计数以有符号的32位整数保存,其范围为1901-12-13 20:45:52到2038-01-19 03:14:07。64位体系结构通常会使
time\t
成为64位有符号整数,这几乎永远扩展了它的范围。我个人尽量避免使用C时间API尽可能地使用它比完全忽略它更难。非常感谢您的宝贵见解!不幸的是,如果没有这样指定,我认为使用
mktime
转换为
DateTime
不是一个好主意。那么您的
tm
所在的时区是什么?对于
tm。这取决于客户使用应用程序的位置。
130925235970000000