我正在尝试将一个变体从VT_DATE转换为不变的 VT_BSTR。以下代码适用于Windows:
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 5上,上面的代码返回E_FAIL。有人能纠正上述代码或提供替代方案吗?
编辑:将日期转换为字符串后,我将使用该字符串执行一个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);发布于 2008-09-23 03:33:16
这并不是真正的答案,但是将日期更改为字符串并不是一个区域不变的任务,它很大程度上取决于区域设置。在本例中,我将变量时间转换为系统时间,然后使用sprintf样式函数将其转换为字符串。
发布于 2008-09-23 15:32:35
(很抱歉,我花了一段时间才做出回应(“工作”,你知道.)
从COM的角度来看,我不认为代码有什么问题。
也许问题在于LOCALE_INVARIANT。它是在Windows中引入的;也许在Windows系列中不支持它?
尝试将区域设置更改为LOCALE_USER_DEFAULT,并检查是否仍有错误。大多数情况下,这将是最合适的区域设置;特别是当您试图向用户显示该值时。
如果您确实需要一种特定的格式,因为您需要将该值传递到解析它的其他地方,那么尝试使用与您的需求相匹配的特定区域设置;也许是en_US。
请告诉我们事情进展如何。
发布于 2008-09-23 13:31:00
在你的上下文中不确定,但似乎你走错了路。为什么不使用VarBstrFromDate呢?这将使用区域设置(或者可选择地忽略一个区域设置),并且很可能更接近您想要的结果。
https://stackoverflow.com/questions/115916
复制相似问题