MFC中实现从窗口设定的日期和时间开始显示日期和时间

MFC中实现从窗口设定的日期和时间开始显示日期和时间

最近几天做一个小项目,在功能上实现从窗口输入日期和时间,然后从输入的日期和时间开始计时,为了实现这一功能,自己查阅了一些资料,MFC中的Ctime类和CtimeSpan类,可以很方便的实现,但是中间也遇到一些小问题,费了一些时间才解决,在这里和大家分享一下,一起学习。
这里主要是基于MFC对话框实现的,和在控制台中的程序实现有些区别,在代码实现部分,我会明确的给大家说明一下。

MFC中的Ctime类和CtimeSpan类

Ctime类

Ctime类的对象表示的时间是基于格林威治标准时间(GMT)的,一般不会被继承使用,其对象的大小是八个字节。它所能表示的时间上限是3000年12月31日,下限是1970年1月1日12:00:00AM GMT;
Ctime 初始化和常用函数:
构造方法:
CTime(int nYear,int nMonth,int nDay,int nHour,int nMin,int nSec,int nDST = -1);
以本地时间的年、月、日、小时、分钟、秒等几个时间分量构造CTime对象。参数nYear、nMonth、nDay、nHour、nMin、nSec分别表示年、月、日、小时、分钟、秒,取值范围如下:
时间分量 取值范围
nYear 1970-3000
nMonth 1-12
nDay 1-31
nHour 0-23
nMin 0-59
nSec 0-59
参数nDST指定是否实行夏令时,为0时表示实行标准时间,为正数时表示实行夏令时,为负数时由系统自动计算实行的是标准时间还是夏令时。
常用函数:
CTime(const SYSTEMTIME& st,int nDST = - 1) ;
以一个SYSTEMTIME结构体变量来构造CTime对象。SYSTEMTIME结构体也是我们对日期时间的常用表示方式。参数st为以本地时间表示的SYSTEMTIME对象,参数nDST同上。
static CTime WINAPI GetCurrentTime( );
获取系统当前日期和时间。返回表示当前日期和时间的CTime对象。
int GetYear( ) const;
获取CTime对象表示时间的年份。范围从1970年1月1日到2038年(包括2038年)1月18日。
int GetMonth( ) const;
获取CTime对象表示时间的月份。范围为1到12。
int GetDay( ) const;
获取CTime对象表示时间的日期。范围为1到31。
int GetHour( ) const;
获取CTime对象表示时间的小时。范围为0到23。
int GetMinute( ) const;
获取CTime对象表示时间的分钟。范围为0到59。
int GetSecond( ) const;
获取CTime对象表示时间的秒。范围为0到59。
int GetDayOfWeek( ) const;
此函数的返回值表示CTime对象代表的是星期几,1表示是周日,2表示是周一,以此类推。
CString Format(LPCTSTR pszFormat) const;
将CTime对象中的时间信息格式化为字符串。参数pszFormat是格式化字符串,与printf中的格式化字符串类似,格式化字符串中带有%前缀的格式码将会被相应的CTime时间分量代替,而其他字符会原封不动的拷贝到返回字符串中。
以上只是给大家列举了一些常见的用法和函数,具体的一些用法可以参考下面的链接,或者查阅MSDN文档。
ctime

CtimeSpan类

CtimeSpan没有基类,一个CtimeSpan对象代表一个相对的时间段,不可以派生。
构造方法:
CTimeSpan( LONG lDays, int nHours, int nMins, int nSecs );
常用函数:
GetDays()
返回此CTimeSpan对象中的完整的天数
GetHours()
返回当前日中的小时数(-23至+23)
GetMinutes()
返回当前小时中的分钟数(-59至+59)
GetSeconds()
返回当前分钟中的秒数(-59至+59)
GetTotalHours()
返回此CTimeSpan对象中的完整的小时数
GetTotalMinutes()
返回此CTimeSpan.对象中的完整的分钟数
GetTotalSeconds()
返回此CTimeSpan对象中的完整的秒数
以上只是给大家列举了一些常见的用法和函数,具体的一些用法可以参考下面的链接,或者查阅MSDN文档。
CtimeSpan

说明:Ctime类和CtimeSpan类对一些运算符进行了重载,在进行计算时:
两个ctime类进行计算,返回的是CtimeSpan类的对象。
Ctime类和CtimeSpan类进行计算,返回的对象是Ctime类。在代码中可以看到。

代码实现

这里主要是通过vs2013中的mfc框架创建一个对话框的空项目,做了一个简单的界面,如下:
在这里插入图片描述
上面六个编辑框作为日期和时间的设置框,依次为:年,月,日,时,分,秒。ID依次为IDC_year,IDC_month,IDC_day,IDC_hour,IDC_minutes,IDC_seconds。中间较长的编辑框用来动态显示时间,ID为IDC_TIME,关联的成员变量为cTime。具体如下:
在这里插入图片描述
添加四个全局变量:

int sec;
int mins;
int housrs;
int  days;

用来保存计算出来的时间间隔。

在开始按钮的函数中加入以下代码:

	UpdateData(TRUE);//获取控件的值到变量中
	CTimeSpan tm = CTime::GetCurrentTime()-CTime(cYear, cMonth, cDay, cHour, cMinutes, cSeconds);//计算当前系统时间与设定的时间之间的间隔
	//这里我开始的时候是这样写的:
	//创建对象 Ctime  tm1=CTime::GetCurrentTime()
	//Ctime tm2(cYear, cMonth, cDay, cHour, cMinutes, cSeconds)
	//CTimeSpan tm=tm1=tm2;但是不知道为什么,这样写程序显示的时候就不会显示正确的结果。感兴趣的可以试下。
	//下面获取的顺序不能够乱,否则运行的结果就会出错
	//正确:
	sec = tm.GetSeconds();
	mins = tm.GetMinutes();
	housrs = tm.GetHours();
	days = tm.GetDays();
	//错误:
	/*
	下面这样写的结果在mfc中会出现秒数大于60,分钟大于60....,总之就是比较乱,详细的自己可以试下,这里就不过多描述了,当在控制台程序中,就不会出现这样的情况,控制台程序中需要加入头文件#include "atltime.h"
	days = tm.GetDays();
	housrs = tm.GetHours();
	mins = tm.GetMinutes();
	sec = tm.GetSeconds();
	*/
	SetTimer(1, 1000, NULL);//启动定时器,每隔一秒触发一次

定时器函数中代码:

	CTime endtime = CTime::GetCurrentTime() - CTimeSpan(days, housrs, mins, sec);
	cTime = endtime.Format("%Y-%m-%d-%H-%M-%S");
	UpdateData(FALSE);

最终运行的结果如下:
在这里插入图片描述
最后说下思路:就是先计算当前系统时间和设定时间的时间间隔并保存下来,然后每隔一秒获取系统时间,减去计算好的时间间隔,就可以实现从设定的时间开始动态显示了。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值