SystemTimeToVariantTime 源码 实现
时间: 2024-01-18 19:04:56 浏览: 33
以下是一个简单的实现 SystemTimeToVariantTime 函数的示例代码:
```c++
#include <windows.h>
bool SystemTimeToVariantTime(const SYSTEMTIME& st, double& vt)
{
FILETIME ft;
if (!SystemTimeToFileTime(&st, &ft))
return false;
ULARGE_INTEGER ull;
ull.LowPart = ft.dwLowDateTime;
ull.HighPart = ft.dwHighDateTime;
vt = (double)(ull.QuadPart / 10000000ULL - 11644473600ULL) + ((double)st.wMilliseconds / 1000.0);
return true;
}
```
这个实现方法的原理是,先将 SYSTEMTIME 结构转换为 FILETIME 结构,然后将 FILETIME 转换为 64 位整数,最后将整数转换为 Variant 时间格式。其中,11644473600ULL 是一个常量,表示 1601 年 1 月 1 日 00:00:00 到 1970 年 1 月 1 日 00:00:00 的秒数差。
相关问题
SystemTimeToVariantTime 源码实现
SystemTimeToVariantTime是Windows API中的一个函数,用于将SYSTEMTIME结构体转换为DATE结构体,即将Windows系统时间转换为VariantTime。以下是SystemTimeToVariantTime的源码实现:
```C++
BOOL WINAPI SystemTimeToVariantTime(
_In_ const SYSTEMTIME *lpSystemTime,
_Out_ double *pvtime
)
{
// 参数验证
if (!lpSystemTime || !pvtime)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
// 将SYSTEMTIME结构体转换为FILETIME结构体
FILETIME ft;
if (!SystemTimeToFileTime(lpSystemTime, &ft))
{
return FALSE;
}
// 将FILETIME结构体转换为64位整数表示的时间
ULARGE_INTEGER ull;
ull.LowPart = ft.dwLowDateTime;
ull.HighPart = ft.dwHighDateTime;
ull.QuadPart /= 10000; // 转换为毫秒
// 计算VariantTime
*pvtime = (((double)ull.QuadPart) / (double)(24 * 3600 * 1000)) + 25569.0;
return TRUE;
}
```
该函数首先将SYSTEMTIME结构体转换为FILETIME结构体,然后将FILETIME结构体转换为64位整数表示的时间,最后根据VariantTime的规则计算出双精度浮点数表示的VariantTime。需要注意的是,VariantTime的日期起点为1900年1月1日,而系统时间的起点为1601年1月1日,因此在计算VariantTime时需要加上25569.0。
SystemTimeToVariantTime的源码实现
这是一个将系统时间转换为Variant时间的函数的简化版本源码实现:
```cpp
#include <windows.h>
bool SystemTimeToVariantTime(const SYSTEMTIME& sysTime, double& variantTime)
{
// 将系统时间转换为文件时间
FILETIME fileTime;
if (!SystemTimeToFileTime(&sysTime, &fileTime))
{
return false;
}
// 将文件时间转换为64位整数
ULARGE_INTEGER uli;
uli.LowPart = fileTime.dwLowDateTime;
uli.HighPart = fileTime.dwHighDateTime;
// 计算Variant时间
variantTime = (uli.QuadPart - 116444736000000000) / 10000000.0;
return true;
}
```
这个函数使用Windows API来将给定的SYSTEMTIME结构转换为Variant时间。它首先将系统时间转换为文件时间,然后将文件时间转换为64位整数。最后,通过减去一个固定的偏移量并除以10,000,000来计算Variant时间。函数返回一个布尔值,指示转换是否成功。如果成功,Variant时间将存储在传入的variantTime参数中。请注意,这只是一个简化的实现,实际的源码可能更复杂并处理更多错误情况。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)