gpt4 book ai didi

c++ - 如何在 C++ 中将 Windows DATE 转换为 Unix 时间

转载 作者:行者123 更新时间:2023-11-30 05:21:19 29 4
gpt4 key购买 nike

Windows 使用 DATE类型来表示日期。这是一个 double 值,表示自 1899 年 12 月 30 日午夜以来的天数。

如何将 DATE 转换为 Unix 时间戳(自 1970 年 1 月 1 日以来的秒数)值?

具体来说,仅使用 c++ 标准库和 MinGW 为其分发头文件的 Windows 库如何实现?

例如,我可以从 IShellFolder2 中获取日期属性:

void MyFunc(IShellFolder2 *folder, PCUITEMID_CHILD pidl, const SHCOLUMNID *columnid) {
VARIANT* v = (VARIANT*) malloc(sizeof(VARIANT));
DATE d;
HRESULT hr = folder->GetDetailsEx(pidl, colid, v);
if (SUCCEEDED(hr)) {
hr = VariantChangeType(v, v, 0, VT_DATE);
if (SUCCEEDED(hr)) {
d = v->date;
}
VariantClear(v);
}
free(v);
// process date here
}

然后如何转换此值以用于使用 Unix 时间戳格式的软件?

当前使用的头文件(并非都与此特定问题相关):

#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <shlobj.h>
#include <shlwapi.h>
#include <propkey.h>
#include <wchar.h>
#include <shlguid.h>
#include <string>
#include <vector>

最佳答案

使用VariantTimeToSystemTimeDATE 转换为 SYSTEMTIME

SYSTEMTIME 转换为 unix 时间是一项简单的任务。

在 Visual Studio 中,您可以使用 COleDateTime,但这在 MinGW 中不可用

#include <Windows.h>
#include <stdio.h>
#include <time.h>
#include <OleAuto.h>

unsigned int unix_stamp_of_DATE(DATE date)
{
//convert DATE to SYSTEMTIME
SYSTEMTIME st;
VariantTimeToSystemTime(date, &st);

//convert SYSTEMTIME to FILETIME
FILETIME ft;
SystemTimeToFileTime(&st, &ft);

//convert FILETIME to ULARGE_INTEGER
//then QuadPart is 64bit timestamp
ULARGE_INTEGER ul{ ft.dwLowDateTime, ft.dwHighDateTime };
return (unsigned int)((ul.QuadPart - 116444736000000000ULL)/10000000);
}

用法:

int main()
{
DATE dt = 25569.000000f; //1970, 1, 1
time_t rawtime = unix_stamp_of_DATE(dt);

tm *timeinfo = gmtime(&rawtime); //DATE was UTC!

char buf[50];
strftime(buf, sizeof(buf), "%c", timeinfo);
printf("%s\n", buf);
return 0;
}

解释:unix_epoch116444736000000000U,计算为

ULARGE_INTEGER unix_epoch{ 0 };
FILETIME ft;
SYSTEMTIME st = { 0 };
st.wDay = 1;
st.wMonth = 1;
st.wYear = 1970;
SystemTimeToFileTime(&st, &ft);
unix_epoch = ULARGE_INTEGER{ ft.dwLowDateTime, ft.dwHighDateTime };
//=116444736000000000U

替代方法

int main()
{
DATE dt = 25569.000000; //1970,1,1
SYSTEMTIME st;
VariantTimeToSystemTime(dt, &st);

time_t rawtime;
struct tm * timeinfo;
time(&rawtime);

//system time or localtime?
timeinfo = gmtime(&rawtime);
//timeinfo = localtime(&rawtime);
timeinfo->tm_year = st.wYear - 1900;
timeinfo->tm_mon = st.wMonth - 1;
timeinfo->tm_mday = st.wDay;
timeinfo->tm_hour = st.wHour;
timeinfo->tm_min = st.wMinute;
timeinfo->tm_sec = st.wSecond;
mktime(timeinfo);

printf("%d\n", st.wYear);

return 0;
}

关于c++ - 如何在 C++ 中将 Windows DATE 转换为 Unix 时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40210756/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com