2013-03-06 106 views
1

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

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

  • 但是,如何设置这种状态,甚至有可能吗?
  • 如果这是不可能的,我猜boost::optional<CTime>将是一个很好的选择?
+0

默认ctor创建一个未初始化的CTime,因此您可以从中指定。 – 2013-03-06 15:23:38

+0

@roger_rowland:我尝试过'CTime tmp'和'CTime tmp = CTime()'。在这两种情况下'Format'都返回'01.01.1970'(有效日期),而不是文档中所说的空字符串。 – 2013-03-06 15:28:23

+0

这是一种痛苦 - 我想下一个最好的做法是将一个CTime和一个bool包装在一个结构中,然后使用它。使用bool标记非空CTime。任何人有其他想法? – 2013-03-06 15:44:17

回答

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

因此,总之,使用类似于你建议的boost::optional来表示空值。

+0

感谢您深入了解MFC和您的分析。我要用'boost :: optional',第一次使用它,它运行良好。 – 2013-03-08 14:53:59