gpt4 book ai didi

c++ - WinAPI 将 FILETIME 格式化为带有日期和/或时间的本地化字符串

转载 作者:行者123 更新时间:2023-11-27 22:40:38 27 4
gpt4 key购买 nike

我正在寻找一个低级别的 WinAPI 来将日期时间从 FILETIME 格式化为本地化的字符串,同时输出日期、时间或日期和时间。

通过反转 MFC 的 COleDateTime 我能够找到 VarBstrFromDate “有点”起作用的功能。所以我想看看是否有另一个更可靠的 API 可以实现这一点。

我发现 VarBstrFromDate 有两个问题:

1) 它不能可靠地报告日期或时间部分。例如,如果我这样称呼 1899 年 12 月 31 日午夜:

BSTR bstr = NULL;
HRESULT hr = ::VarBstrFromDate(1.0, LANG_USER_DEFAULT, VAR_FOURDIGITYEARS, &bstr);
::SysFreeString(bstr);

它返回没有时间部分的 "12/31/1899"

或者,如果我调用它,比如 1899 年 12 月 30 日中午:

BSTR bstr = NULL;
HRESULT hr = ::VarBstrFromDate(0.5, LANG_USER_DEFAULT, VAR_FOURDIGITYEARS, &bstr);
::SysFreeString(bstr);

它返回没有日期部分的 "12:00:00 PM"

2) 此外,从 FILETIMEDATE 的转换有些棘手,尤其是对于 1899 年 12 月 30 日之前的日期。同样,通过逆向 MFC,我能够找到 SystemTimeToVariantTime可以通过 SYSTEMTIME 结构来完成。有点倒退,但没关系。但后来我在 atlcore.h 中看到了这个怪物:

inline BOOL AtlConvertSystemTimeToVariantTime(
_In_ const SYSTEMTIME& systimeSrc,
_Out_ double* pVarDtTm)
{
ATLENSURE(pVarDtTm!=NULL);
//Convert using ::SystemTimeToVariantTime and store the result in pVarDtTm then
//convert variant time back to system time and compare to original system time.
BOOL ok = ::SystemTimeToVariantTime(const_cast<SYSTEMTIME*>(&systimeSrc), pVarDtTm);
SYSTEMTIME sysTime;
::ZeroMemory(&sysTime, sizeof(SYSTEMTIME));

ok = ok && ::VariantTimeToSystemTime(*pVarDtTm, &sysTime);
ok = ok && (systimeSrc.wYear == sysTime.wYear &&
systimeSrc.wMonth == sysTime.wMonth &&
systimeSrc.wDay == sysTime.wDay &&
systimeSrc.wHour == sysTime.wHour &&
systimeSrc.wMinute == sysTime.wMinute &&
systimeSrc.wSecond == sysTime.wSecond);

return ok;
}

您知道他们为什么要检查 SystemTimeToVariantTime 返回的结果,然后以这种笨拙的方式将其传递给 VariantTimeToSystemTime 吗?这是否意味着 SystemTimeToVariantTime 可能会返回不正确的结果,或者什么?

无论如何,我正在考虑寻找另一个不依赖于转换为浮点 DATE 的 API。

最佳答案

您可以使用 kernel32 中的经典时间函数:首先调用 FileTimeToSystemTime然后调用GetTimeFormatGetDateFormat . SHFormatDateTime是这些函数的包装器。

外壳还有StrFromTimeInterval如果您需要持续时间的友好文本。

关于c++ - WinAPI 将 FILETIME 格式化为带有日期和/或时间的本地化字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49285691/

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