COleDateTime获取对象的time_t

COleDateTime类本身没有提供获取对象的time_t的接口,需要使用CTime的GetTime()来实现获取

COleDateTime t1 = COleDateTime::GetCurrentTime();

SYSTEMTIME systime;

t1.GetAsSystemTime(systime);

CTime cct1(systime);

cout << cct1.GetTime() << endl;



MFC中有两个类:COleDatetime(以DATE为基础),CTime(以__time64_t为基础)

如果绑定的是日期型控件,一定要用COleDatetime!虽然CTime可以精确到3000年,但是超过这个范围,CTime是要抛出异常,让你程序崩溃的!

在MFC中操作时间的类主要有两对:CTime和CTimeSpan与 COleDateTime和COleDateTimeSpan,CTime和CTimeSpan主要封装了ANSI time_t和关于time_t的Run-Time库的主要函数,CTime里面使用的成员变量是time_t类型,该类型是个long型,由于long 类型的原因,所以该类只能处理4294967296秒约68年的数据,所以用CTime只能处理1970年到2038年的日期。

幸好,MFC同时提供了COleDateTime和COleDateTimeSpan类,使用该两个类完全可以代替CTime和 CTimeSpan,COleDateTime和COleDateTimeSpan类所使用的成员变量是DATE类型,该类型是个double类型,而且使用的单位是日,所以可以处理从100年1月1日到9999年12月31日的日期时间,COleDateTime类的日期计算主要是操作公有成员变量 COleDateTime::m_dt,该变量是DATE即double类型,该变量是为零时是1899年12月30日0时0分0秒,大于零时的日期比 1899年12月30日0时0分0秒大,反之亦然,例如:

COleDateTime t;
t.m_dt=0;
AfxMessageBox(t.Format("%Y-%m-%d %H:%M:%S"));
运行的结果是:1899-12-30 00:00:00


COleDateTime t;
t.m_dt=39444.437731;
AfxMessageBox(t.Format("%Y-%m-%d %H:%M:%S"));
运行的结果是:2007-10-28 10:30:20


反过来以可以得到变量的值,例如:
COleDateTime t(2004,12,28,22,22,22);
CString str;
str.Format("%f",t.m_dt);
AfxMessageBox(str);
运行的结果是:38349.932199


COleDateTimeSpan类是用于对COleDateTime类的两个时间的时间间隔的计算,COleDateTimeSpan类使用的成员变量COleDateTimeSpan::m_span是一个double类型是用于记录两个COleDateTime::m_dt的时间差,例如:
COleDateTime t1(2006,1,1,0,0,0);
COleDateTime t2(2007,1,1,0,0,0);
COleDateTimeSpan ts=t2-t1;
CString str;
str.Format("%f",ts.m_span);
AfxMessageBox(str);
运行的结果是:365.000000


反过来也可以得到日期
COleDateTime t1(2006,1,1,0,0,0);
COleDateTimeSpan ts;
ts.m_span=400.0;
COleDateTime t2=t1+ts;
AfxMessageBox(t2.Format("%c"));
运行的结果是:02/05/07 00:00:00


可是在使用COleDateTimeSpan类中以下的几个函数可要小心,这不知道是不是MFC的一个Bug,
double GetTotalDays( ) const;
double GetTotalHours( ) const;
double GetTotalMinutes( ) const;
double GetTotalSeconds( ) const;
几个函数的返回值都是double类型
但是,如double GetTotalSeconds( ) const;在MFC内部的原形是:
_AFXDISP_INLINE double COleDateTimeSpan::GetTotalSeconds() const
{ ASSERT(GetStatus() == valid);
long lReturns = (long)(m_span * 24 * 60 * 60 + AFX_OLE_DATETIME_HALFSECOND);
return lReturns;
}
看到没有,它返回的实际是个long类型,并不是一个double类型,所以在使用这几个函数的时候计算两个时间的间隔不要太大,特别是 GetTotalSeconds( )函数,如计算两个时间的间隔大于68年时就会溢出,所以我建议直接读取COleDateTimeSpan::m_span变量的值,这是一个单位为日的时间间隔,例如:
COleDateTime t1(2000,1,1,0,0,0);
COleDateTime t2(2070,1,1,0,0,0);
COleDateTimeSpan ts=t2-t1;
CString str;
str.Format("%f",ts.GetTotalSeconds());
AfxMessageBox(str);
运行的结果是:-2085892096.000000
这个结果明显是一个溢出,如果使用
str.Format("%f",ts.m_span*86400);
则会得到2209075200.000000。
所以灵活使用COleDateTime类的m_dt变量和COleDateTimeSpan类的m_span变量操作会得到意想不到的收获

time_t是C/C++语言标准库中的时间类型,表示从格林威治时间1970年1月1日00:00:00到当前时间的秒数。CTime、SYSTEMTIME、COleDateTime、COleVariant是MFC中的时间类型,用于便捷地进行日期和时间的操作。 下面是它们之间的互相转换代码及讲解: 1. time_t to CTime ```cpp time_t t = time(NULL); CTime time(t); ``` 这段代码将当前时间的time_t类型转换为CTime类型。CTime类型的构造函数可以接受time_t类型的参数,将其转换为CTime类型。 2. CTime to time_t ```cpp CTime time(2021, 10, 1, 0, 0, 0); time_t t = time.GetTime(); ``` 这段代码将指定时间的CTime类型转换为time_t类型。CTime类型的GetTime函数返回从格林威治时间1970年1月1日00:00:00到当前时间的秒数,即time_t类型。 3. SYSTEMTIME to CTime ```cpp SYSTEMTIME st; GetLocalTime(&st); CTime time(st); ``` 这段代码将当前时间的SYSTEMTIME类型转换为CTime类型。CTime类型的构造函数可以接受SYSTEMTIME类型的参数,将其转换为CTime类型。 4. CTime to SYSTEMTIME ```cpp CTime time(2021, 10, 1, 0, 0, 0); SYSTEMTIME st; time.GetAsSystemTime(st); ``` 这段代码将指定时间的CTime类型转换为SYSTEMTIME类型。CTime类型的GetAsSystemTime函数将CTime类型转换为SYSTEMTIME类型。 5. COleDateTime to CTime ```cpp COleDateTime dt; dt = COleDateTime::GetCurrentTime(); CTime time(dt.GetYear(), dt.GetMonth(), dt.GetDay(), dt.GetHour(), dt.GetMinute(), dt.GetSecond()); ``` 这段代码将当前时间的COleDateTime类型转换为CTime类型。COleDateTime类型的GetCurrentTime函数返回当前时间的COleDateTime类型,CTime类型的构造函数可以接受COleDateTime类型的参数,将其转换为CTime类型。 6. CTime to COleDateTime ```cpp CTime time(2021, 10, 1, 0, 0, 0); COleDateTime dt(time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond()); ``` 这段代码将指定时间的CTime类型转换为COleDateTime类型。COleDateTime类型的构造函数可以接受CTime类型的参数,将其转换为COleDateTime类型。 7. COleVariant to CTime ```cpp COleVariant var; var = COleDateTime::GetCurrentTime(); CTime time(var.date); ``` 这段代码将当前时间的COleVariant类型转换为CTime类型。COleVariant类型的构造函数可以接受COleDateTime类型的参数,将其转换为COleVariant类型,CTime类型的构造函数可以接受DATE类型的参数,将其转换为CTime类型。 8. CTime to COleVariant ```cpp CTime time(2021, 10, 1, 0, 0, 0); COleVariant var(time); ``` 这段代码将指定时间的CTime类型转换为COleVariant类型。COleVariant类型的构造函数可以接受CTime类型的参数,将其转换为COleVariant类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值