【问题标题】:Is CTime nullable?CTime 可以为空吗?
【发布时间】:2013-02-21 10:01:32
【问题描述】:

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

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

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

【问题讨论】:

  • 默认 ctor 创建一个未初始化的 CTime,因此您可以从中分配。
  • @roger_rowland:我试过CTime tmpCTime tmp = CTime()。在这两种情况下,Format 都返回 `01.01.1970'(有效日期),而不是文档所述的空字符串。
  • 这很痛苦 - 我想下一个最好的方法是将 CTime 和 bool 包装在一个结构中并使用它来代替。使用 bool 标记非空 CTime。有人有其他想法吗?
  • +1 表示boost::optional。这是最“惯用”的解决方案。
  • 使用 COleDateTime。它有一个“状态”属性。其中一个值为 NULL

标签: winapi mfc null nullable 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。如果 _tcsftime 失败,您只会得到 NULL,但这不会是因为“null”时间。

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

【讨论】:

  • 感谢您对 MFC 的深入了解和您的分析。我用boost::optional,第一次用,效果很好。
猜你喜欢
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 2017-03-07
  • 2012-05-18
  • 2018-03-10
相关资源
最近更新 更多