CTime обнуляется?

В приложении MFC мне нравится отображать значения даты в SQL (CDBVariant) в МФЦ CTime, Поскольку записи в базе данных могут быть NULL (значение не существует), мне интересно, если CTime обнуляемый Замечание в документации МФЦ к CTime::Format заставляет меня задуматься, это должно быть возможно:

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

  • Но как установить этот статус, это вообще возможно?
  • Если это невозможно, я думаю boost::optional<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 представлять ноль.

Другие вопросы по тегам