3

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

  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 日

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

4

2 回答 2

1

我想你得到的是 2014 年 1 月 10 日,而不是 2014 年 10 月 10 日。除了您在不提供 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));

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

在此处输入图像描述

你得到:

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

在此处输入图像描述

你得到:

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

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

于 2015-10-23T08:14:01.720 回答
0

我认为您也想将其传递lcidParseDateTime()

dData.ParseDateTime(L"10/1/2014 9:43:00 AM", VAR_DATEVALUEONLY, lcid);
于 2015-10-23T07:23:47.520 回答