0

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

4

1 に答える 1