如何在 C++ 中将毫秒时间转换为 FILETIME
Posted
技术标签:
【中文标题】如何在 C++ 中将毫秒时间转换为 FILETIME【英文标题】:How to convert milli seconds time to FILETIME in c++ 【发布时间】:2018-02-22 10:02:41 【问题描述】:我有一个以秒为单位的时间(例如:1505306792)。
如何将其转换为 FILETIME?
这是我尝试过的代码
INT64 timer64 = 1505306792;
timer64 = timer64 *1000 *10000;
ULONGLONG xx = timer64;
FILETIME fileTime;
ULARGE_INTEGER uliTime;
uliTime.QuadPart = xx;
fileTime.dwHighDateTime = uliTime.HighPart;
fileTime.dwLowDateTime = uliTime.LowPart;
这个结果 FILETIME 是 1648-09-13 15:34:00
我预计这个日期是 2017-09-13 12:46:31 。使用在线转换器时,我也遇到了同样的情况。
知道如何解决这个问题吗?
我已经看到一些使用 boost 的答案,但它在我的项目中可用。
【问题讨论】:
一毫秒 = 1/1000 秒。为什么要乘以千万? 我查找的第一个文件时间转换器 (silisoftware.com/tools/…),当您使用其默认设置并输入 1505306792 时,您会得到 2017 年 9 月 13 日星期三下午 12:46:32 的输出。基于其默认值,我认为您需要关注输入格式为 unix。 有一个时代差异:***.com/questions/6161776/… 【参考方案1】:关于加116444736000000000,见How To Convert a UNIX time_t to a Win32 FILETIME or SYSTEMTIME:
#include <winbase.h>
#include <winnt.h>
#include <time.h>
void UnixTimeToFileTime(time_t t, LPFILETIME pft)
// Note that LONGLONG is a 64-bit value
LONGLONG ll;
ll = Int32x32To64(t, 10000000) + 116444736000000000;
pft->dwLowDateTime = (DWORD)ll;
pft->dwHighDateTime = ll >> 32;
【讨论】:
Windows 使用 1601 年 1 月 1 日作为纪元?多么奇怪。 很明显,人们需要可以追溯到那么远的电子表格。没有进一步的。以上是关于如何在 C++ 中将毫秒时间转换为 FILETIME的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Redshift 中将时间戳(具有毫秒)转换为 EPOCH
如何在 Java 中将 ZonedDateTime 转换为毫秒?
如何在 iOS/XCode 中将毫秒时间戳转换为日期和时间?