Winapi CTime可以为空吗?

Winapi CTime可以为空吗?,winapi,mfc,null,nullable,ctime,Winapi,Mfc,Null,Nullable,Ctime,在MFC应用程序中,我喜欢将SQL日期值(CDBVariant)映射到MFCCTime。因为数据库条目可以为NULL(值不存在),我想知道CTime是否可以为NULL。toCTime::Format让我思考,它应该是可能的: 如果此CTime对象的状态为null,则返回值为空字符串 但如何设置这种状态,甚至可能吗 如果不可能,我想boost::optional将是一个不错的选择 CTime只是\uuuu time64\u t的包装。调用format时,它会执行以下操作: inline CStr

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

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

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

CTime只是
\uuuu time64\u t
的包装。调用format时,它会执行以下操作:

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;
}
因此,您要查看的系统函数是
\u tcsftime
。这就是我认为文档不太准确的地方。如果
\u localtime64\u s
失败,您将得到一个异常,因此“null”时间不能真正传递给
\u tcsftime
。只有当
\u tcsftime
失败时,才会得到NULL,但这不是因为“NULL”时间


因此,简而言之,使用您建议的
boost::optional
来表示null。

CTime只是
\uuu time64\u t
的包装器。调用format时,它会执行以下操作:

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;
}
因此,您要查看的系统函数是
\u tcsftime
。这就是我认为文档不太准确的地方。如果
\u localtime64\u s
失败,您将得到一个异常,因此“null”时间不能真正传递给
\u tcsftime
。只有当
\u tcsftime
失败时,才会得到NULL,但这不是因为“NULL”时间


因此,简而言之,使用您建议的
boost::optional
表示null。

默认的ctor创建一个未初始化的CTime,因此您可以从中赋值。@roger\u rowland:我尝试了
CTime tmp
CTime tmp=CTime()
。在这两种情况下,
Format
都返回'01.01.1970'(一个有效日期),而不是文档中所说的空字符串。这是一个难题-我想下一个最好的方法是将CTime和bool包装在结构中,然后使用它。使用bool标记非空CTime。有人有其他想法吗?+1代表
boost::optional
。这是最“惯用”的解决方案。使用COleDateTime。它有一个“status”属性。其中一个值为Null默认ctor创建未初始化的CTime,因此您可以从中赋值。@roger_rowland:我尝试了
CTime tmp
CTime tmp=CTime()
。在这两种情况下,
Format
都返回'01.01.1970'(一个有效日期),而不是文档中所说的空字符串。这是一个难题-我想下一个最好的方法是将CTime和bool包装在结构中,然后使用它。使用bool标记非空CTime。有人有其他想法吗?+1代表
boost::optional
。这是最“惯用”的解决方案。使用COleDateTime。它有一个“status”属性。其中一个值是null,感谢您对MFC的深入了解和您的分析。我将使用
boost::optional
,这是我第一次使用它,它运行良好。感谢您对MFC的深入了解和您的分析。我将使用
boost::optional
,这是我第一次使用它,而且效果很好。