0

试图找到函数 SystemTimeToFileTime 的完整模拟,但找不到。

我有所有 SYSTEMTIME 和 FILETIME 结构,在 linux 上正确工作的 SYSTEMTIME 用于日期差异函数:

int64_t Delta2(const SYSTEMTIME st1, const SYSTEMTIME st2) { 

    union timeunion { FILETIME fileTime; ULARGE_INTEGER ul; } ;
    timeunion ft1;
    timeunion ft2;
    SystemTimeToFileTime(&st1, &ft1.fileTime);
    SystemTimeToFileTime(&st2, &ft2.fileTime);

    return ft2.ul.QuadPart - ft1.ul.QuadPart; 
}

有人知道该SystemTimeToFileTime功能的确切替换吗?

4

4 回答 4

1

AFILETIME只是一个分辨率为 10 毫秒的时间戳,分为两个 32 位数字。一个 POSIX 时间戳(具有第二个分辨率)可以简单地乘以 100 来得到它。

要从 aSYSTEMTIME到 a FILETIME,您可以struct tm使用相关字段创建 a,并用于mktime创建time_t. 将该时间戳放在一个 64 位整数中,乘以 100(以获得 10 毫秒的分辨率)并添加该SYSTEMTIME wMilliseconds字段(除以 10),然后您就拥有了FILETIME.

于 2013-02-01T13:05:20.223 回答
0

我建议您查阅 WINE 项目的源代码,其中包含您需要的内容。

于 2013-02-01T12:58:18.457 回答
0

SYSTEMTIME

指定日期和时间,使用月、日、年、工作日、小时、分钟、秒和毫秒的各个成员。时间采用协调世界时 (UTC) 或本地时间,具体取决于所调用的函数。

最接近的类型是struct tm,尽管它没有毫秒。

FILETIME

包含一个 64 位值,表示自 1601 年 1 月 1 日 (UTC) 以来的 100 纳秒间隔数。

您可以使用struct timeval(支持微秒)或struct timespec(支持纳秒)

例如,并非所有文件系统都支持纳秒ext4

SystemTimeToFileTime

您可以使用mktime它,尽管您将只获得自纪元 (1970-01-01 00:00 UTC) 以来的秒数。

所以,至少可以说,一个精确的替换是困难的。

于 2013-02-01T13:21:25.363 回答
0

Linux 本身没有“文件时间”的概念。根据您正在做什么,最好使用difftime(以秒为单位给出两个 time_t 之间的差异作为浮点数),或者使用一些更精确的时间戳并将其转换为 10ms 间隔的差异?

您可以使用mktime将日期/时间值转换为time_t.

于 2013-02-01T13:21:47.407 回答