You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

224 lines
5.5 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "StdAfx.h"
#include "WorkTime.h"
CWorkTime gWorkTime;
CWorkTime::CWorkTime(void)
{
m_bRecordTime = false;//是否正在计时
m_BackTime1Seconds = 0;//倒计时秒数
m_BackTime2Seconds = 0;//倒计时秒数
m_bBackTime1End = false;//倒计时1 是否判断过
}
CWorkTime::~CWorkTime(void)
{
}
CString CWorkTime::Int2Str_LeftZero(int n)
{
CString s;
if(n<10)
s.Format("0%ld",n);//左边补0
else
s.Format("%ld",n);
return s;
}
#if 1//粗略计时
//开始计时
void CWorkTime::StartRecordTime()
{
m_bRecordTime = true;
m_StartTime=CTime::GetCurrentTime();
}
void CWorkTime::StopRecordTime()
{
m_bRecordTime = false;
}
CString CWorkTime::GetTimeSpanStr()
{
if(!m_bRecordTime)
{
return "";
}
//获取当前系统时间
CTime CurTime;
CTimeSpan TimeSpan;//时间差
CurTime=CTime::GetCurrentTime();
TimeSpan = CurTime - m_StartTime;
return GetTimeSpanStr(TimeSpan);
}
//当前经过了多少秒
double CWorkTime::GetTimeSpanSecond()
{
CTimeSpan TimeSpan = GetTimeSpan();
int s = 0;
s += TimeSpan.GetHours() * 60 * 60;
s += TimeSpan.GetMinutes() * 60;
s += TimeSpan.GetSeconds();
return s;
}
CTimeSpan CWorkTime::GetTimeSpan()
{
//获取当前系统时间
CTime CurTime;
CTimeSpan TimeSpan;//时间差
CurTime=CTime::GetCurrentTime();
TimeSpan = CurTime - m_StartTime;
return TimeSpan;
}
//获取当前经过时间
CString CWorkTime::GetTimeSpanStr(CTimeSpan &TimeSpan)
{
return Int2Str_LeftZero(TimeSpan.GetHours())+":"+Int2Str_LeftZero(TimeSpan.GetMinutes())+":"+Int2Str_LeftZero(TimeSpan.GetSeconds());
}
//获取当天的字符串"12:02:25"
CString CWorkTime::GetCurDate(CString Separator)
{
CString str;
CTime CurTime;
CurTime=CTime::GetCurrentTime();
str += Int2Str_LeftZero(CurTime.GetYear())+Separator;
str += Int2Str_LeftZero(CurTime.GetMonth())+Separator;
str += Int2Str_LeftZero(CurTime.GetDay());
return str;
}
//获取当前的年
CString CWorkTime::GetCurYear()
{
CString str;
CTime CurTime;
CurTime=CTime::GetCurrentTime();
str += Int2Str_LeftZero(CurTime.GetYear());
return str;
}
//获取当前的月
CString CWorkTime::GetCurMonth()
{
CString str;
CTime CurTime;
CurTime=CTime::GetCurrentTime();
str += Int2Str_LeftZero(CurTime.GetMonth());
return str;
}
CString CWorkTime::GetCurDay()
{
CString str;
CTime CurTime;
CurTime=CTime::GetCurrentTime();
str += Int2Str_LeftZero(CurTime.GetDay());
return str;
}
//获取当前时间Separator 为分隔符
CString CWorkTime::GetCurTime(CString Separator)
{
CString str;
CTime CurTime;
CurTime=CTime::GetCurrentTime();
str += Int2Str_LeftZero(CurTime.GetHour())+Separator;
str += Int2Str_LeftZero(CurTime.GetMinute())+Separator;
str += Int2Str_LeftZero(CurTime.GetSecond());
return str;
}
CString CWorkTime::GetDateTime(CString SeparatorDate,CString SeparatorTime)
{
CString CurDate = GetCurDate(SeparatorDate);
CString CurTime = GetCurTime(SeparatorTime);
CString DateTime = CurDate + SeparatorDate + CurTime;
return DateTime;
}
CString CWorkTime::GetDateStr(CTime Time,CString Separator)
{
CString str;
str += Int2Str_LeftZero(Time.GetYear())+Separator;
str += Int2Str_LeftZero(Time.GetMonth())+Separator;
str += Int2Str_LeftZero(Time.GetDay());
return str;
}
//当前经过了多少分钟
int CWorkTime::GetTimeSpanMin(CTimeSpan &TimeSpan)
{
int m = 0;
m += TimeSpan.GetHours()*60;
m += TimeSpan.GetMinutes();
return m;
}
#endif
#if 1//精确计时
//开始精确计时
void CWorkTime::StartExactTime()
{
QueryPerformanceCounter(&m_ExactStart);
}
#endif
#if 1//倒计时功能
//开始倒计时(Time2 到了之后才结束计时)
void CWorkTime::StartBackTime(double Time1,double Time2)
{
m_BackTime1Seconds = Time1;
m_BackTime2Seconds = Time2;
m_bBackTime1End = false;//倒计时1 是否判断过
StartRecordTime();
}
//获取还剩多少时间
CString CWorkTime::GetLeftTimes()
{
double CurSeconds = GetTimeSpanSecond();//当前经过的秒数
int LeftSeconds = (int)(m_BackTime2Seconds-CurSeconds);
CString str = "00:00:00";
if(LeftSeconds>0)
{
int Seconds = LeftSeconds % 60;
LeftSeconds -= Seconds;
int Minutes = (LeftSeconds%3600)/60;
LeftSeconds -= Minutes*60;
int Hours = LeftSeconds/3600;
str = Int2Str_LeftZero(Hours)+":"+Int2Str_LeftZero(Minutes)+":"+Int2Str_LeftZero(Seconds);
}
return str;
}
//倒计时是否结束(idx == 1 或者idx == 2)
bool CWorkTime::IsBackTimeEnd(int idx)
{
if(!m_bRecordTime)//已经结束
return true;
if(idx==1 && m_bBackTime1End)//保证倒计时1 只返回一次
return false;
double CurSeconds = GetTimeSpanSecond();//当前经过的秒数
double BackTimeSeconds = (idx==1)?m_BackTime1Seconds:m_BackTime2Seconds;
if(CurSeconds > BackTimeSeconds)
{
if(idx==2)
{
m_bRecordTime = false;//结束计时
}
else
{
m_bBackTime1End = true;
}
return true;
}
return false;
}
#endif
//微秒级延时us为微秒
void CWorkTime::DelayTime(unsigned int us)
{
if(us>0)
{
LARGE_INTEGER ClockFre;
QueryPerformanceFrequency(&ClockFre);
LARGE_INTEGER start, end;
LONGLONG count = (us*ClockFre.QuadPart)/(1000*1000);
QueryPerformanceCounter(&start);
count = count + start.QuadPart ;
do
{
QueryPerformanceCounter(&end);
}while(end.QuadPart<count);
}
}