首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++在美国日期的COleDateTime中,LCID的正确用法是什么

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

Stack Overflow用户
提问于 2015-01-08 17:47:25
回答 2查看 1.9K关注 0票数 3

我需要解析一个美国日期字符串来提取日期。

代码语言:javascript
复制
  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日

有人能告诉我我哪里做错了吗?

EN

回答 2

Stack Overflow用户

发布于 2015-10-23 16:14:02

我想你会得到2014年1月10日,而不是2014年10月10日。除了不提供lcid参数的解析(并使用LANG_USER_DEFAULT -请参见另一个答案)之外,解析代码使用VarDateFromStr,反过来,它可能不会执行复杂的模式匹配,而只是请求区域设置的LOCALE_IDATE值。

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

代码语言:javascript
复制
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));

With (参见“短日期”设置):

你会得到:

代码语言:javascript
复制
LOCALE_IDATE: 1
10-Jan-14
09-Jan-14

并使用

你会得到:

代码语言:javascript
复制
LOCALE_IDATE: 0
10/1/2014
9/30/2014

我认为您应该避免使用这个遗留API解析日期/时间字符串,除非您只是在同一系统上将参数字符串从value格式化回来。

票数 1
EN

Stack Overflow用户

发布于 2015-10-23 15:23:48

我认为您也希望将lcid传递给ParseDateTime()

代码语言:javascript
复制
dData.ParseDateTime(L"10/1/2014 9:43:00 AM", VAR_DATEVALUEONLY, lcid);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27837094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档