206 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			206 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #ifndef _MINI_DATE_TIME_H_
 | ||
| #define _MINI_DATE_TIME_H_
 | ||
| 
 | ||
| //一种以秒数定义的类
 | ||
| #include <time.h>
 | ||
| 
 | ||
| class SecondTime
 | ||
| {
 | ||
| public:
 | ||
| 	//定义短时间类型开始的年份
 | ||
| 	static const int YearBase = 2010;
 | ||
| 	static const int BaseYear = 1900;//为方便移植性,日期类型使用tm,这个时间是以1900年的1月1日凌晨开始算
 | ||
| 	//定义时间是否已经开始计时的标志位
 | ||
| 	static const unsigned int RecordFlag = 0x80000000;
 | ||
| 	//定义各种单位的时间的秒数
 | ||
| 	static const unsigned int SecOfMin  = 60;
 | ||
| 	static const unsigned int SecOfHour = SecOfMin * 60;
 | ||
| 	static const unsigned int SecOfDay  = SecOfHour * 24;
 | ||
| 	static const unsigned int SecOfYear[2];
 | ||
| 	static const unsigned int SecOfMonth[2][13];//以月为第二数组的下标,免去月份-1的操作!
 | ||
| 	static const unsigned int MonthDays[2][13];//以月为第二数组的下标,免去月份-1的操作!
 | ||
| 
 | ||
| public:
 | ||
| 
 | ||
| 	SecondTime& encode(const unsigned int year, const unsigned int mon, const unsigned int day,
 | ||
| 	                   const unsigned int hour, const unsigned int min, const unsigned int sec);
 | ||
| 
 | ||
| 	// 从MiniDataTime转化到系统时间。暂时只精确到天。
 | ||
| 	void decode(tm& sysTime);
 | ||
| 	void decode(SYSTEMTIME& sysTime);
 | ||
| 	time_t decode()		//注意:根据tm的decode封装转换接口,如果tm的修改为正常,此接口也要修改
 | ||
| 	{
 | ||
| 		tm hehe;
 | ||
| 		decode(hehe);
 | ||
| 		hehe.tm_year -= 1900;	//***
 | ||
| 		hehe.tm_mon -= 1;		//***
 | ||
| 		return mktime(&hehe);
 | ||
| 	}
 | ||
| 
 | ||
| 	inline bool isSameDay(const SecondTime& rhs)
 | ||
| 	{
 | ||
| 		return ((tv & (~RecordFlag)) / SecOfDay) == ((rhs.tv & (~RecordFlag)) / SecOfDay) ? true : false;
 | ||
| 	}
 | ||
| 
 | ||
| 	//从SystemTime结构中设置日期时间值
 | ||
| 	inline SecondTime& encode(time_t systime)
 | ||
| 	{
 | ||
| 		return encode(*localtime(&systime));
 | ||
| 	}
 | ||
| 	inline SecondTime& encode(const tm& sysTime)
 | ||
| 	{
 | ||
| 		return encode(1900 + sysTime.tm_year, sysTime.tm_mon + 1, sysTime.tm_mday, sysTime.tm_hour, sysTime.tm_min, sysTime.tm_sec);
 | ||
| 	}
 | ||
| 	inline SecondTime& encode(const SYSTEMTIME& sysTime)
 | ||
| 	{
 | ||
| 		return encode(sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, sysTime.wMinute, sysTime.wSecond);
 | ||
| 	}
 | ||
| 	//开始记录时间,timeOfNow参数表示当前时间的短时间类型值
 | ||
| 	inline SecondTime& startRecord(const unsigned int timeOfNow)
 | ||
| 	{
 | ||
| 		if (!(tv & RecordFlag))
 | ||
| 			tv = RecordFlag | ((timeOfNow & (~RecordFlag)) + tv);
 | ||
| 
 | ||
| 		return *this;
 | ||
| 	}
 | ||
| 	bool isStartRecord()
 | ||
| 	{
 | ||
| 		return (tv & RecordFlag) ? true : false;
 | ||
| 	}
 | ||
| 
 | ||
| 	//获取当前日期时间的短时间值
 | ||
| 	inline static unsigned int now()
 | ||
| 	{
 | ||
| 		SecondTime tv;
 | ||
| 		time_t timep;
 | ||
| 		struct tm* sysTime;
 | ||
| 		time(&timep);
 | ||
| 		sysTime = localtime(&timep);
 | ||
| 		tv.encode(1900 + sysTime->tm_year, sysTime->tm_mon + 1, sysTime->tm_mday, sysTime->tm_hour, sysTime->tm_min, sysTime->tm_sec);
 | ||
| 		return tv.tv;
 | ||
| 	}
 | ||
| 	//获取今天凌晨的时间
 | ||
| 	inline static unsigned int today()
 | ||
| 	{
 | ||
| 		SecondTime tv;
 | ||
| 		time_t timep;
 | ||
| 		struct tm* sysTime;
 | ||
| 		time(&timep);
 | ||
| 		sysTime = localtime(&timep);
 | ||
| 		tv.encode(1900 + sysTime->tm_year, sysTime->tm_mon + 1, sysTime->tm_mday, 0, 0, 0);
 | ||
| 		return tv.tv;
 | ||
| 	}
 | ||
| 	//计算昨天凌晨时间
 | ||
| 	inline static unsigned int yesterday()
 | ||
| 	{
 | ||
| 		return today() - 3600 * 24;
 | ||
| 	}
 | ||
| 
 | ||
| 	//计算明日凌晨的值
 | ||
| 	inline static unsigned int tomorrow()
 | ||
| 	{
 | ||
| 		return today() + 3600 * 24;
 | ||
| 	}
 | ||
| 
 | ||
| 	// 计算相对于当前MiniDateTime所指示的时间点的明天
 | ||
| 	inline unsigned int rel_tomorrow()
 | ||
| 	{
 | ||
| 		unsigned v = tv & (~RecordFlag);
 | ||
| 		v = (v + SecOfDay) / SecOfDay * SecOfDay;
 | ||
| 		return (tv & RecordFlag) | v;
 | ||
| 	}
 | ||
| 
 | ||
| 	// // 计算相对于当前MiniDateTime所指示的时间点的当前开始时间点
 | ||
| 	inline unsigned int rel_today()
 | ||
| 	{
 | ||
| 		unsigned v = tv & (~RecordFlag);
 | ||
| 		v = v / SecOfDay * SecOfDay;
 | ||
| 		return (tv & RecordFlag) | v;
 | ||
| 	}
 | ||
| 
 | ||
| 	//判断是否是闰年的函数
 | ||
| 	inline static bool isLeapYear(const unsigned int year)
 | ||
| 	{
 | ||
| 		return ((year % 4) == 0) && ((year % 100 != 0) || (year % 400 == 0));
 | ||
| 	}
 | ||
| 
 | ||
| 
 | ||
| public:
 | ||
| 	//转换为unsigned int的类型转换运算符
 | ||
| 	inline operator unsigned int()
 | ||
| 	{
 | ||
| 		return tv;
 | ||
| 	}
 | ||
| 	//从unsigned int复制的运算符函数
 | ||
| 	inline SecondTime& operator = (const unsigned int time)
 | ||
| 	{
 | ||
| 		tv = time;
 | ||
| 		return *this;
 | ||
| 	}
 | ||
| 	//重载相等判断的运算符
 | ||
| 	inline bool operator == (const unsigned int time)
 | ||
| 	{
 | ||
| 		return tv == time;
 | ||
| 	}
 | ||
| 	//重载不等判断的运算符
 | ||
| 	inline bool operator != (const unsigned int time)
 | ||
| 	{
 | ||
| 		return tv != time;
 | ||
| 	}
 | ||
| 	inline bool operator > (const unsigned int time)
 | ||
| 	{
 | ||
| 		return (tv & (~RecordFlag)) > (time & (~RecordFlag));
 | ||
| 	}
 | ||
| 	inline bool operator >= (const unsigned int time)
 | ||
| 	{
 | ||
| 		return (tv & (~RecordFlag)) >= (time & (~RecordFlag));
 | ||
| 	}
 | ||
| 	inline bool operator < (const unsigned int time)
 | ||
| 	{
 | ||
| 		return (tv & (~RecordFlag)) < (time & (~RecordFlag));
 | ||
| 	}
 | ||
| 	inline bool operator <= (const unsigned int time)
 | ||
| 	{
 | ||
| 		return (tv & (~RecordFlag)) <= (time & (~RecordFlag));
 | ||
| 	}
 | ||
| 	//重载+运算符,避免对是否使用的标志位进行运算
 | ||
| 	inline unsigned int operator + (const unsigned int time)
 | ||
| 	{
 | ||
| 		return ((tv & (~RecordFlag)) + (time & (~RecordFlag))) & (~RecordFlag);
 | ||
| 	}
 | ||
| 	//重载-运算符,避免对是否使用的标志位进行运算
 | ||
| 	inline unsigned int operator - (const unsigned int time)
 | ||
| 	{
 | ||
| 		return ((tv & (~RecordFlag)) - (time & (~RecordFlag))) & (~RecordFlag);
 | ||
| 	}
 | ||
| 	//重载+=运算符,避免对是否使用的标志位进行运算
 | ||
| 	inline SecondTime& operator += (const unsigned int time)
 | ||
| 	{
 | ||
| 		tv = (tv & RecordFlag) | (((tv & (~RecordFlag)) + (time & (~RecordFlag))) & (~RecordFlag));
 | ||
| 		return *this;
 | ||
| 	}
 | ||
| 	//重载-=运算符,避免对是否使用的标志位进行运算
 | ||
| 	inline SecondTime& operator -= (const unsigned int time)
 | ||
| 	{
 | ||
| 		tv = (tv & RecordFlag) | (((tv & (~RecordFlag)) - (time & (~RecordFlag))) & (~RecordFlag));
 | ||
| 		return *this;
 | ||
| 	}
 | ||
| public:
 | ||
| 	SecondTime()
 | ||
| 	{
 | ||
| 		tv = 0;
 | ||
| 	}
 | ||
| 	SecondTime(const SecondTime& mt)
 | ||
| 	{
 | ||
| 		tv = mt.tv;
 | ||
| 	}
 | ||
| 	SecondTime(const unsigned int tva)
 | ||
| 	{
 | ||
| 		tv = tva;
 | ||
| 	}
 | ||
| public:
 | ||
| 	unsigned int tv;
 | ||
| };
 | ||
| 
 | ||
| #endif
 |