2013-03-06 78 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

相關問題