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

标签 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 日返回

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

最佳答案

我想您得到的是 10-Jan-2014,而不是 10-Oct-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 解析日期/时间字符串,除非你只是在同一系统上从值格式化参数字符串。

关于C++ 在美国日期的 COleDateTime 中 LCID 的正确用法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27837094/

相关文章:

c++ - 通过 Alpha-Beta 修剪迭代加深 Negamax

c++ - 使用应用程序类有什么好处?

excel - *.csv 增加文件大小

ruby-on-rails - 如何在I18n语言环境文件中的模型之间指定共享属性转换?

Spring REST 处理语言环境更改

c++ - 错误消息 : "setw is not defined" using g++

c++ - 为什么我在编译 OpenVino 示例时遇到此错误

c - 如何在 C 中使用逗号作为千位分隔符来格式化数字?

mysql - 使用 mysql 将 varchar 数据按摩成数字

python - 如何在 VSCode 中更改 Python 扩展语言环境?