2016-11-07 2 views
1

Я пытаюсь разобраться в утверждающем, что я имею, когда я называюповедения COleDateTime при использовании максимальной даты

COleDateTime time; 
this->m_wndDate.GetTime(time); 

и датой в моем Datepicker является 31/12/9999 (ДД/ММ/YYYY) функция

BOOL CDateTimeCtrl::GetTime(_Out_ COleDateTime& timeDest) const 

показывает мне ASSERT(timeDest.GetStatus() == COleDateTime::valid); (winctrl5.cpp, line 181), но в соответствии с документацией является действительной датой.

Я не могу понять, почему это происходит. Кто-нибудь сталкивался с этой проблемой раньше?

Заранее благодарен!

EDIT: Вызывается метод GetTime, когда пользователь меняет DatePicker.

ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DATE, OnDatetimechangeDate) 

...

void WDlgRelParamVar::OnDatetimechangeDate(NMHDR* pNMHDR, LRESULT* pResult) 
{ 
    LPNMDATETIMECHANGE pNMDATE = (LPNMDATETIMECHANGE)pNMHDR; 
    COleDateTime time; 
    this->m_wndDate.GetTime(time); 
    ... 
+0

Ваш часовой пояс будет иметь аффект, пользователи SO * действительно * должны указать свою страну в своем профиле SO. Это может быть более недействительным после преобразования в UTC, как это делает COleDateTime. Сначала вы должны проверить перегрузку GetTime (LPSYSTEMTIME). –

+0

@ HansPassant Я из Бразилии, поэтому UTC-03: 00, он только ударяет по утверждению, когда дата установлена ​​на 31/12/9999, повлияет ли часовой пояс даже в этом случае? – Penachia

+0

Вы работаете на XP? Какова версия Common Controls (check manifest)? –

ответ

0

Это выглядит как элемент управления захватывающего DateTime неправильно инициализируется в вызове GetTime() на нем.

Попробуйте запустить следующий фрагмент кода, чтобы увидеть, если он работает, как ожидалось:

COleDateTime dt(9999, 12, 31, 23, 59, 59); 
COleDateTime::DateTimeStatus st = dt.GetStatus(); 
ASSERT(st == COleDateTime::valid); 

Вы не дали код, который устанавливает формат ввода для даты выбора времени. Чтобы задать формат, вам необходимо использовать m_wndDate.SetFormat(_T("dd/MM/yyyy"));. Обратите внимание, что он чувствителен к регистру. Таким образом, ваш формат DD/MM/YYYY неверен.

+0

Спасибо за ваш ответ, но это не сработает! Конструктор COleDateTime по умолчанию установил объект в 0 (полночь, 30 декабря 1899 г.), так что ему не нужна дополнительная инициализация. Я считаю, что проблема заключается в преобразовании SYSTEMTIME в COleDateTIme внутри функции CDateTimeCtrl :: GetTime. – Penachia

+0

Я считаю, что ваша проблема связана с форматом установки для 'CDateTimeCtrl' –

+0

Это должно быть dd/MM/yyyy, а не DD/MM/YYYY. Прочтите это для получения более подробной информации: https://msdn.microsoft.com/ru-ru/library/windows/desktop/bb761726#dtp_format_chars –