форматирование — C ++ Как правильно использовать 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);

Я ожидаю, что это вернется 1 октября 2014 года, но вместо этого он вернется 10 октября 2014 года

Может кто-нибудь, пожалуйста, скажите мне, что я здесь делаю неправильно?

3

Решение

Я полагаю, вы получите 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, если только вы не отформатировали строку аргумента обратно из значения в той же системе.

1

Другие решения

Я думаю, что вы хотите передать lcid к ParseDateTime() тоже:

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

По вопросам рекламы [email protected]