FILETIME
日付、時刻、または日付と時刻を一緒に出力して、日付時刻をローカライズされた文字列にフォーマットするための低レベルの WinAPI を探しています。
MFCを逆にすることで、「ちょっと」機能する機能COleDateTime
を見つけることができました。VarBstrFromDate
だから私はそれを達成できる別のより信頼できる API があるかどうかを確認しようとしていました.
私が見ることができる2つの問題がありVarBstrFromDate
ます:
1)日付または時刻の部分を確実に報告しません。たとえば、次のように呼び出すとmidnight Dec. 31, 1899
:
BSTR bstr = NULL;
HRESULT hr = ::VarBstrFromDate(1.0, LANG_USER_DEFAULT, VAR_FOURDIGITYEARS, &bstr);
::SysFreeString(bstr);
"12/31/1899"
時刻部分なしで返されます。
または、私がそれを呼び出す場合は、次のように言いますnoon Dec. 30, 1899
:
BSTR bstr = NULL;
HRESULT hr = ::VarBstrFromDate(0.5, LANG_USER_DEFAULT, VAR_FOURDIGITYEARS, &bstr);
::SysFreeString(bstr);
"12:00:00 PM"
日付部分なしで返されます。
2)FILETIME
さらに、 からへ の変換DATE
は、特に 1899 年 12 月 30 日より前の日付の場合、やや注意が必要です。MFC を逆にすることで、構造体SystemTimeToVariantTime
を介して変換できることがわかりましたSYSTEMTIME
。ちょっと後ろ向きだけどOK。しかし、その後、私はこの怪物を見ました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
とにかく、浮動小数点への変換に依存しない別の API を見つけることを考えていましたDATE
。