155 lines
3.3 KiB
C++
155 lines
3.3 KiB
C++
|
|
//#include <Windows.h>
|
||
|
|
#include <stdio.h>
|
||
|
|
#include "share_util.h"
|
||
|
|
#include "second_time.h"
|
||
|
|
|
||
|
|
const unsigned int SecondTime::SecOfYear[2] = { 365 * SecOfDay, 366 * SecOfDay };
|
||
|
|
|
||
|
|
const unsigned int SecondTime::SecOfMonth[2][13] =
|
||
|
|
{
|
||
|
|
{0, 31 * SecOfDay, 28 * SecOfDay, 31 * SecOfDay, 30 * SecOfDay, 31 * SecOfDay, 30 * SecOfDay, 31 * SecOfDay, 31 * SecOfDay, 30 * SecOfDay, 31 * SecOfDay, 30 * SecOfDay, 31 * SecOfDay},
|
||
|
|
{0, 31 * SecOfDay, 29 * SecOfDay, 31 * SecOfDay, 30 * SecOfDay, 31 * SecOfDay, 30 * SecOfDay, 31 * SecOfDay, 31 * SecOfDay, 30 * SecOfDay, 31 * SecOfDay, 30 * SecOfDay, 31 * SecOfDay}
|
||
|
|
};
|
||
|
|
|
||
|
|
const unsigned int SecondTime::MonthDays[2][13] =
|
||
|
|
{
|
||
|
|
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
|
||
|
|
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
|
||
|
|
};
|
||
|
|
|
||
|
|
SecondTime& 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)
|
||
|
|
{
|
||
|
|
int i;
|
||
|
|
unsigned int v = 0;
|
||
|
|
|
||
|
|
//计算年份经过的秒数
|
||
|
|
for (i = year - 1; i >= YearBase; --i)
|
||
|
|
{
|
||
|
|
v += SecOfYear[isLeapYear(i)];
|
||
|
|
}
|
||
|
|
|
||
|
|
//计算当年1月到本月的秒数
|
||
|
|
bool boLeepYear = isLeapYear(year);
|
||
|
|
|
||
|
|
for (i = mon - 1; i >= 1; --i)
|
||
|
|
{
|
||
|
|
v += SecOfMonth[boLeepYear][i];
|
||
|
|
}
|
||
|
|
|
||
|
|
//计算当年1号到今天的秒数
|
||
|
|
v += (day - 1) * SecOfDay;
|
||
|
|
|
||
|
|
//计算今天0点到现在的秒数
|
||
|
|
v += hour * SecOfHour;
|
||
|
|
|
||
|
|
//计算当前小时的0分到现在的秒数
|
||
|
|
v += min * SecOfMin;
|
||
|
|
|
||
|
|
v += sec;
|
||
|
|
|
||
|
|
tv = (tv & RecordFlag) | (v & (~RecordFlag));
|
||
|
|
return *this;
|
||
|
|
}
|
||
|
|
|
||
|
|
void SecondTime::decode(tm& sysTime)
|
||
|
|
{
|
||
|
|
unsigned int v = tv & (~RecordFlag);
|
||
|
|
|
||
|
|
// 年
|
||
|
|
int year = YearBase;
|
||
|
|
|
||
|
|
for( ; ;)
|
||
|
|
{
|
||
|
|
unsigned int nSecOfCurrYear = SecOfYear[isLeapYear(year)];
|
||
|
|
|
||
|
|
if (v >= nSecOfCurrYear)
|
||
|
|
{
|
||
|
|
v -= nSecOfCurrYear;
|
||
|
|
year++;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 月
|
||
|
|
bool bIsLeepYear = isLeapYear(year);
|
||
|
|
int month = 1; // index based 1 <<<<
|
||
|
|
|
||
|
|
for( ; ;)
|
||
|
|
{
|
||
|
|
unsigned int nSecOfCurrMonth = SecOfMonth[bIsLeepYear][month];
|
||
|
|
|
||
|
|
if (v >= nSecOfCurrMonth)
|
||
|
|
{
|
||
|
|
v -= nSecOfCurrMonth;
|
||
|
|
month++;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 日
|
||
|
|
int day = v / SecOfDay + 1; // index based 1 <<<<
|
||
|
|
|
||
|
|
//memset(&sysTime, 0, sizeof(sysTime));
|
||
|
|
sysTime.tm_year = year;
|
||
|
|
sysTime.tm_mon = month;
|
||
|
|
sysTime.tm_mday = day;
|
||
|
|
//小时、分、秒
|
||
|
|
unsigned int SecOfToday = v % (24 * 3600);
|
||
|
|
sysTime.tm_hour = SecOfToday / 3600;
|
||
|
|
sysTime.tm_min = (SecOfToday % 3600) / 60;
|
||
|
|
sysTime.tm_sec = SecOfToday % 60;
|
||
|
|
}
|
||
|
|
|
||
|
|
void SecondTime::decode(SYSTEMTIME& sysTime)
|
||
|
|
{
|
||
|
|
unsigned int v = tv & (~RecordFlag);
|
||
|
|
|
||
|
|
// 年
|
||
|
|
int year = YearBase;
|
||
|
|
|
||
|
|
for( ; ;)
|
||
|
|
{
|
||
|
|
unsigned int nSecOfCurrYear = SecOfYear[isLeapYear(year)];
|
||
|
|
|
||
|
|
if (v >= nSecOfCurrYear)
|
||
|
|
{
|
||
|
|
v -= nSecOfCurrYear;
|
||
|
|
year++;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 月
|
||
|
|
bool bIsLeepYear = isLeapYear(year);
|
||
|
|
int month = 1; // index based 1 <<<<
|
||
|
|
|
||
|
|
for( ; ;)
|
||
|
|
{
|
||
|
|
unsigned int nSecOfCurrMonth = SecOfMonth[bIsLeepYear][month];
|
||
|
|
|
||
|
|
if (v >= nSecOfCurrMonth)
|
||
|
|
{
|
||
|
|
v -= nSecOfCurrMonth;
|
||
|
|
month++;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 日
|
||
|
|
int day = v / SecOfDay + 1; // index based 1 <<<<
|
||
|
|
|
||
|
|
//memset(&sysTime, 0, sizeof(sysTime));
|
||
|
|
sysTime.wYear = year;
|
||
|
|
sysTime.wMonth = month;
|
||
|
|
sysTime.wDay = day;
|
||
|
|
//小时、分、秒
|
||
|
|
unsigned int SecOfToday = v % (24 * 3600);
|
||
|
|
sysTime.wHour = SecOfToday / 3600;
|
||
|
|
sysTime.wMinute = (SecOfToday % 3600) / 60;
|
||
|
|
sysTime.wSecond = SecOfToday % 60;
|
||
|
|
}
|