0

VARIANT を VT_DATE から不変のVT_BSTR に変換しようとしています。次のコードは、Windows XP で動作します。

VARIANT va;
::VariantInit(&va);

// set the variant to VT_DATE
SYSTEMTIME st;
memset(&st, 0, sizeof(SYSTEMTIME));
st.wYear = 2008;
st.wMonth = 9;
st.wDay = 22;
st.wHour = 12;
st.wMinute = 30;

DATE date;
SystemTimeToVariantTime(&st, &date);

va.vt = VT_DATE;
va.date = date;

// change to a string
err = ::VariantChangeTypeEx(&va, 
                &va, 
                LOCALE_INVARIANT, 
                0, 
                VT_BSTR);

しかし、PPC 2003 および Windows Mobile 5 では、上記のコードは E_FAIL を返します。誰かが上記のコードを修正するか、代替案を提供できますか?

EDIT:日付を文字列に変換した後、文字列を使用してSQL更新を行っています。デバイスの地域設定に関係なく更新を機能させたいので、「不変」形式に変換しようとしています。

現在、次を使用して、日付を機能するように見える形式に変換しています。

err = ::VariantTimeToSystemTime(va.date, &time);
if (FAILED(err))
    goto cleanup;

err = strDate.PrintF(_T("%04d-%02d-%02d %02d:%02d:%02d.%03d"),
    time.wYear,
    time.wMonth,
    time.wDay,
    time.wHour,
    time.wMinute,
    time.wSecond,
    time.wMilliseconds);
4

3 に答える 3

1

これは実際には答えではありませんが、日付を文字列に変更することはロケールに依存しないタスクではありません。ロケールに大きく依存します。この場合、VariantTimeをSystemTimeに変換してから、sprintfスタイルの関数を使用して文字列に変換します。

于 2008-09-23T03:33:16.353 に答える
1

(返信に時間がかかって申し訳ありません(「仕事」です...))

COM の観点からは、コードに問題はありません。

問題は LOCALE_INVARIANT にあるのかもしれません。Windows XP で導入されました。Windows CE ファミリではサポートされていないのでしょうか。

ロケールをLOCALE_USER_DEFAULTに変更してみて、それでもエラーが発生するかどうかを確認してください。とにかく、ほとんどの場合、これが最も適切なロケールです。特にユーザーに値を表示しようとしている場合。

値を解析する別の場所に値を渡す必要があるため、特定の形式が本当に必要な場合は、要件に一致する特定のロケールを使用してみてください。おそらく en_US です。

それがどうなるか教えてください。

于 2008-09-23T15:32:35.593 に答える
0

ここでのコンテキストでは定かではありませんが、間違った道を進んでいるようです。VarBstrFromDateを使用しないのはなぜですか? これはロケールを使用する (またはオプションでロケールを無視する) ことを許可し、おそらくあなたが望むものにはるかに近いでしょう。

于 2008-09-23T13:31:00.580 に答える