Мне нужно проанализировать американскую строку даты, чтобы извлечь дату.
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 октября 2014 года, но вместо этого он вернется 10 октября 2014 года
Может кто-нибудь, пожалуйста, скажите мне, что я здесь делаю неправильно?
Я полагаю, вы получите 10 января 2014 года, а не 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));
С (см. Настройку «Короткая дата»):
ты получаешь:
LOCALE_IDATE: 1
10-Jan-14
09-Jan-14
и с
ты получаешь:
LOCALE_IDATE: 0
10/1/2014
9/30/2014
Я полагаю, что вам следует избегать синтаксического анализа строк даты / времени с использованием этого устаревшего API, если только вы не отформатировали строку аргумента обратно из значения в той же системе.
Я думаю, что вы хотите передать lcid
к ParseDateTime()
тоже:
dData.ParseDateTime(L"10/1/2014 9:43:00 AM", VAR_DATEVALUEONLY, lcid);