C ++在美国日期的COleDateTime中正确使用LCID是什么

时间:2015-01-08 09:47:25

标签: c++ formatting locale lcid coledatetime

我需要解析美国日期字符串以提取日期。

  COleDateTime dData;
  LCID lcid = 0x409; // 0x409 is the locale ID for English US
  CString strDate;

  dData.ParseDateTime("10/1/2014 9:43:00 AM", VAR_DATEVALUEONLY);
  strDate = dData.Format(0, lcid);

我预计这将在2014年10月1日返回,但它会在2014年10月10日返回

有人可以告诉我这里的错误吗?

2 个答案:

答案 0 :(得分:1)

我想你将在2014年1月10日,而不是2014年10月10日。除了你的解析而没有提供lcid参数(并使用LANG_USER_DEFAULT代替 - 请参阅另一个答案),解析代码使用VarDateFromStr,而这可能 - 大概是 - 不进行复杂的模式匹配,而只是请求{ {3}}语言环境的值。

您拥有的1(日 - 月 - 年)值会导致此值顺序。

LCID lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); // 0x409 is the locale ID for English US
TCHAR pszIDate[32] = { 0 };
ATLVERIFY(GetLocaleInfo(lcid, LOCALE_IDATE, pszIDate, _countof(pszIDate)) > 0);
_tprintf(_T("LOCALE_IDATE: %s\n"), pszIDate);
COleDateTime dData;
dData.ParseDateTime(_T("10/1/2014 9:43:00 AM"), VAR_DATEVALUEONLY, lcid); // LANG_USER_DEFAULT
_tprintf(_T("%s\n"), dData.Format(0, lcid));
dData.m_dt -= 1.0;
_tprintf(_T("%s\n"), dData.Format(0, lcid));

使用(参见"短日期"设置):

LOCALE_IDATE

你得到:

LOCALE_IDATE: 1
10-Jan-14
09-Jan-14

enter image description here

你得到:

LOCALE_IDATE: 0
10/1/2014
9/30/2014

我想你应该避免使用这个遗留API来解析日期/时间字符串,除非你只是从同一系统的值格式化了参数字符串。

答案 1 :(得分:0)

我想你也希望将lcid传递给ParseDateTime()

dData.ParseDateTime(L"10/1/2014 9:43:00 AM", VAR_DATEVALUEONLY, lcid);