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
来表示空值。
默认ctor创建一个未初始化的CTime,因此您可以从中指定。 – 2013-03-06 15:23:38
@roger_rowland:我尝试过'CTime tmp'和'CTime tmp = CTime()'。在这两种情况下'Format'都返回'01.01.1970'(有效日期),而不是文档中所说的空字符串。 – 2013-03-06 15:28:23
这是一种痛苦 - 我想下一个最好的做法是将一个CTime和一个bool包装在一个结构中,然后使用它。使用bool标记非空CTime。任何人有其他想法? – 2013-03-06 15:44:17