自1970年1月1日起,C ++将Windows时间设置为ms

叶夫根尼175

再会。自1970年1月1日以来,我的时间以毫秒为单位,例如1487520625361

因此,我需要从中设置Windows时间。我发现了一个SetLocalTime(&SYSTEMTIME)函数。因此,我需要解析ms数,或者可以更轻松地执行它?

Matteo意大利

通常,您永远都不想使用该SYSTEMTIME结构(该结构已经分解并且仅用于显示),而是使用FILETIME(从1/1/1601开始以100 ns间隔表示的时间表示)并只在结束时进行转换计算。

因此,您需要:

  • 自1970年1月1日起将您的ms转换为自1/1/1601起的100ns;
  • 将结果放入FILETIME;
  • 将转换FILETIMESYSTEMTIME;
  • 呼叫SetLocalTime(如果原始时间戳是本地时间)或SetSystemTime(如果是UTC)。

最无聊的步骤是第一个步骤,因为您必须计算两个纪元之间的差。幸运的是,它已经在KB167296中完成,事实证明我们所追求的数字是116444736000000000。

所以:

void msecSinceEpochToFileTime(uint64_t msecSinceEpoch, FILETIME *ft) {
    uint64_t result = msecSinceEpoch * 10000; // ms => 100ns
    result += 116444736000000000ULL;    // Unix epoch in FILETIME
    ft->dwLowDateTime = (DWORD) result;
    ft->dwHighDateTime = result >> 32;
}

然后转换FILETIMESYSTEMTIME仅仅是调用的问题FileTimeToSystemTime

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何获得自1970年1月1日以来的Python日期时间对象的秒数?

Java时间:从1970年1月1日凌晨1点开始?

如何将自1970年1月1日以来的秒数转换为日期时间值?

自2017年1月1日起,Google OpenId Connect to OpenID 2.0映射将发生什么情况?

自2018年12月1日起,Bitbucket Cloud将禁用对TLSv1和TLSv1.1的支持

C# 将 4 月 1 日设置为一年的开始

转换秒自1900年1月1日在巴西时间戳

在Visual Studio 2017中使用high_resolution_clock来获取错误的日期和时间/从历元时间获取毫秒数(1970年1月1日)

自1970年1月1日以来的年,月,周,天,小时

设置为2014年12月31日的新Date()改为说12月1日

WebScraping 显示为 1970 年 1 月的日期值,而不是使用 Python 的真实值

在Java中如何从纪元以来的秒数,以毫秒为单位转换00:00:00以来1970年1月1日,格林尼治标准时间

为什么我的文件的最后修改时间戳为 1980 年 1 月 1 日?

在Excel 2003中将日期时间格式化为2015年1月1日

在 C# 中硬编码 UTC 日期时间值(公元 1601 年 1 月 1 日午夜 12:00,UTC)

Java.util.Calendar-自1970年1月1日以来的毫秒数

减少自1970年1月1日午夜以来的毫秒数

将ISO日期时间格式设置为2014年3月12日12:00:00

雨果(Hugo)将显示正确格式的日期显示为“ 0001年1月1日”

是否可以将日期显示为2015年1月1日而不是20150101?

无法再挂载Windows文件系统(自2017年5月9日起)

为什么1970年1月1日是“时代”?

1970年1月1日之前的日期

如何确定1970年1月1日返回的日期?

javascript Regex日期1970年1月1日之前

日期始终显示1970年1月1日

输入日期为 dd-mm-yy 并显示日期为 1999 年 1 月 3 日的 C 程序

从2000年1月1日开始从UNIX时间转换为时间戳

将自2000年1月1日以来的纳秒转换为Postgresql中的时间戳