Files
mir_server/Gateway/srvlib/include/second_time.h
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

206 lines
5.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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