FILETIME转时间戳
时间: 2025-06-01 16:18:15 浏览: 22
### 将FILETIME结构转换为Unix时间戳
在Windows系统中,`FILETIME`结构表示自1601年1月1日(UTC)以来经过的100纳秒间隔数。而Unix时间戳表示自1970年1月1日(UTC)以来经过的秒数。为了将`FILETIME`转换为Unix时间戳,需要进行以下计算:
1. 计算从1601年1月1日到1970年1月1日之间的间隔。
2. 将`FILETIME`值转换为以秒为单位的时间。
3. 减去从1601年到1970年的秒数差。
以下是具体的实现方法和代码示例:
#### 1. 时间差计算
从1601年1月1日到1970年1月1日之间的秒数为11644473600秒。这个值可以通过以下公式计算得出:
\[ \text{秒数差} = (1970 - 1601) \times 365.25 \times 24 \times 60 \times 60 \]
#### 2. 转换逻辑
- `FILETIME`结构存储的是100纳秒单位的时间值,因此需要将其除以10,000,000以转换为秒。
- 然后减去11644473600秒,得到Unix时间戳。
#### 3. 实现代码
以下是一个C++代码示例,展示如何将`FILETIME`转换为Unix时间戳:
```cpp
#include <windows.h>
#include <iostream>
// 将FILETIME转换为Unix时间戳
time_t FileTimeToUnixTimestamp(const FILETIME& ft) {
// 将FILETIME转换为ULARGE_INTEGER以便于操作
ULARGE_INTEGER uli;
uli.LowPart = ft.dwLowDateTime;
uli.HighPart = ft.dwHighDateTime;
// 将100纳秒单位转换为秒,并减去从1601到1970的秒数差
const __int64 secondsSince1601 = uli.QuadPart / 10000000LL;
const __int64 secondsBetween1601And1970 = 11644473600LL;
return static_cast<time_t>(secondsSince1601 - secondsBetween1601And1970);
}
int main() {
FILETIME ft;
GetSystemTimeAsFileTime(&ft); // 获取当前系统的FILETIME
time_t unixTimestamp = FileTimeToUnixTimestamp(ft);
std::cout << "Current Unix Timestamp: " << unixTimestamp << std::endl;
return 0;
}
```
#### 4. 注意事项
- 在上述代码中,`GetSystemTimeAsFileTime`函数用于获取当前系统时间的`FILETIME`值[^1]。
- 如果输入的`FILETIME`值来自其他来源(如文件创建时间),可以直接传入该值进行转换。
---
###
阅读全文
相关推荐

















