如何在 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 转换为毫秒?

如何在android中将毫秒转换为日期格式?

如何在 iOS/XCode 中将毫秒时间戳转换为日期和时间?

如何在 Python 中将日期时间对象转换为自纪元(unix 时间)以来的毫秒数?

如何在 Oracle 中将毫秒转换为 hh mm ss 格式