1

在 MFC 应用程序中,我喜欢将 SQL 日期值 ( CDBVariant) 映射到 MFC CTime。因为数据库条目可以为NULL(值不存在),不知是否CTime可以为空。MFC文档中的评论CTime::Format让我思考,应该是可能的:

如果此 CTime 对象的状态为 null,则返回值为空字符串。

  • 但是如何设置这个状态,甚至可能吗?
  • 如果不可能,我想boost::optional<CTime>这是一个不错的选择吗?
4

1 回答 1

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但这不会是因为“null”时间。

所以,简而言之,使用你建议的东西boost::optional来表示空值。

于 2013-03-06T21:10:23.390 回答