2015-01-08 29 views
3

我需要解析美国日期字符串以提取日期。C++在美国日期的COleDateTime中,LCID的正确用法是什么

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); 

我预计这将返回1 - 10月2014,而是它返回年10月10 2014

有人可以告诉我什么,我做错了什么?

回答

0

我想你想通过lcidParseDateTime()太:

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

我想你得到10-JAN-2014,而不是10月10日2014年。除了没有提供lcid参数的解析(并且使用LANG_USER_DEFAULT代替 - 请参阅另一个答案),解析代码使用VarDateFromStr,反过来 - 据推测 - 不会执行复杂的模式匹配,而只是请求区域设置的LOCALE_IDATE值。

您拥有的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)); 

用(见 “短日期” 设置):

enter image description here

你:

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

enter image description here

你:

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

我想你应该宁愿避免使用解析这一传统API,除非你只是格式化参数字符串值从背面在同一系统上的日期/时间字符串。

相关问题