在 MFC 应用程序中,我喜欢将 SQL 日期值 ( CDBVariant
) 映射到 MFC CTime
。因为数据库条目可以为NULL(值不存在),不知是否CTime
可以为空。MFC文档中的评论CTime::Format
让我思考,应该是可能的:
如果此 CTime 对象的状态为 null,则返回值为空字符串。
- 但是如何设置这个状态,甚至可能吗?
- 如果不可能,我想
boost::optional<CTime>
这是一个不错的选择吗?
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
. 如果失败,您只会得到 NULL ,_tcsftime
但这不会是因为“null”时间。
所以,简而言之,使用你建议的东西boost::optional
来表示空值。