2013-03-06 3 views
1

В приложении MFC мне нравится сопоставлять значения даты SQL (CDBVariant) с MFC CTime. Поскольку записи базы данных могут быть NULL (значение не существует), мне интересно, является ли CTime допустимым. remark in the MFC documentation к CTime::Format заставляет меня думать, это должно быть возможно:Является ли CTime нулевым?

Если статус этого объекта CTime имеет нулевое значение, возвращаемое значение является пустой строкой.

  • Но как установить этот статус, это возможно?
  • Если это невозможно, я думаю, что boost::optional<CTime> будет хорошей альтернативой?
+0

По умолчанию ctor создает неинициализированное значение CTime, поэтому вы можете назначить его. –

+0

@roger_rowland: Я пробовал 'CTime tmp' и' CTime tmp = CTime() '. В обоих случаях 'Format' возвращает' 01.01.1970 '(допустимая дата), а не пустую строку, как указано в документации. –

+0

Это боль - я думаю, следующая лучшая вещь - обернуть CTime и bool в структуре и использовать их вместо этого. Используйте bool для отметки непустого значения CTime. У кого-нибудь есть другие идеи? –

ответ

1

CTime - это всего лишь обертка для __time64_t. При вызове формата он делает это:

inline CString CTime::Format(_In_z_ LPCTSTR pFormat) const 
{ 
    if(pFormat == NULL) 
    { 
     return pFormat; 
    } 

    TCHAR szBuffer[maxTimeBufferSize]; 
    struct tm ptmTemp; 

    if (_localtime64_s(&ptmTemp, &m_time) != 0) 
    { 
     AtlThrow(E_INVALIDARG); 
    } 

    if (!_tcsftime(szBuffer, maxTimeBufferSize, pFormat, &ptmTemp)) 
    { 
     szBuffer[0] = '\0'; 
    } 
    return szBuffer; 
} 

Так функция системы вы хотите посмотреть на это _tcsftime. И здесь я думаю, что документация не очень точная. Если сбой _localtime64_s, вы получите исключение, поэтому «нулевое» время не может быть передано _tcsftime. Вы получите только NULL, если _tcsftime сбой, но это не будет из-за «нулевого» времени.

Итак, словом, используйте что-то вроде предложения boost::optional для представления null.

+0

Спасибо за понимание MFC и ваш анализ. Я перехожу к 'boost :: optional', в первый раз я его использовал, и он работает хорошо. –

 Смежные вопросы

  • Нет связанных вопросов^_^