Winapi CTime可以为空吗?
在MFC应用程序中,我喜欢将SQL日期值(Winapi CTime可以为空吗?,winapi,mfc,null,nullable,ctime,Winapi,Mfc,Null,Nullable,Ctime,在MFC应用程序中,我喜欢将SQL日期值(CDBVariant)映射到MFCCTime。因为数据库条目可以为NULL(值不存在),我想知道CTime是否可以为NULL。toCTime::Format让我思考,它应该是可能的: 如果此CTime对象的状态为null,则返回值为空字符串 但如何设置这种状态,甚至可能吗 如果不可能,我想boost::optional将是一个不错的选择 CTime只是\uuuu time64\u t的包装。调用format时,它会执行以下操作: inline CStr
CDBVariant
)映射到MFCCTime
。因为数据库条目可以为NULL(值不存在),我想知道CTime
是否可以为NULL。toCTime::Format
让我思考,它应该是可能的:
如果此CTime对象的状态为null,则返回值为空字符串
- 但如何设置这种状态,甚至可能吗
- 如果不可能,我想
将是一个不错的选择boost::optional
\uuuu time64\u t
的包装。调用format时,它会执行以下操作:
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;
}
因此,您要查看的系统函数是\u tcsftime
。这就是我认为文档不太准确的地方。如果\u localtime64\u s
失败,您将得到一个异常,因此“null”时间不能真正传递给\u tcsftime
。只有当\u tcsftime
失败时,才会得到NULL,但这不是因为“NULL”时间
因此,简而言之,使用您建议的
boost::optional
来表示null。CTime只是\uuu time64\u t
的包装器。调用format时,它会执行以下操作:
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;
}
因此,您要查看的系统函数是\u tcsftime
。这就是我认为文档不太准确的地方。如果\u localtime64\u s
失败,您将得到一个异常,因此“null”时间不能真正传递给\u tcsftime
。只有当\u tcsftime
失败时,才会得到NULL,但这不是因为“NULL”时间
因此,简而言之,使用您建议的
boost::optional
表示null。默认的ctor创建一个未初始化的CTime,因此您可以从中赋值。@roger\u rowland:我尝试了CTime tmp
和CTime tmp=CTime()
。在这两种情况下,Format
都返回'01.01.1970'(一个有效日期),而不是文档中所说的空字符串。这是一个难题-我想下一个最好的方法是将CTime和bool包装在结构中,然后使用它。使用bool标记非空CTime。有人有其他想法吗?+1代表boost::optional
。这是最“惯用”的解决方案。使用COleDateTime。它有一个“status”属性。其中一个值为Null默认ctor创建未初始化的CTime,因此您可以从中赋值。@roger_rowland:我尝试了CTime tmp
和CTime tmp=CTime()
。在这两种情况下,Format
都返回'01.01.1970'(一个有效日期),而不是文档中所说的空字符串。这是一个难题-我想下一个最好的方法是将CTime和bool包装在结构中,然后使用它。使用bool标记非空CTime。有人有其他想法吗?+1代表boost::optional
。这是最“惯用”的解决方案。使用COleDateTime。它有一个“status”属性。其中一个值是null,感谢您对MFC的深入了解和您的分析。我将使用boost::optional
,这是我第一次使用它,它运行良好。感谢您对MFC的深入了解和您的分析。我将使用boost::optional
,这是我第一次使用它,而且效果很好。