/**
* @brief 秒 <--> 日期时刻
*/
#ifdef EN_TIME_SECS
#define YEAR_FROM 2000
#define YEAR_DIFF 2100
static const uint DaysBeforeM[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
uint DateTimeToSeconds (const uint *dt)
{
uint yy, mm, dd;
yy = dt[0] - YEAR_FROM;
dd = yy * 365 + ((yy + 3) >> 2);
if(yy > (YEAR_DIFF - YEAR_FROM)) dd--;
mm = dt[1];
dd += DaysBeforeM[mm - 1];
if((mm > 2) && ((yy & 3) == 0) && (yy != (YEAR_DIFF - YEAR_FROM))) dd++;
dd += dt[2] - 1;
return dd*86400 + dt[3]*3600 + dt[4]*60 + dt[5];
}
void SecondsToDateTime (uint secs, uint *dt)
{
uint yy, mm, dd, tt;
dt[5] = secs % 60;
secs /= 60;
dt[4] = secs % 60;
secs /= 60;
dt[3] = secs % 24;
secs /= 24;
yy = secs / 365;
dd = secs % 365;
tt = (yy + 3) >> 2;
if(yy > (YEAR_DIFF - YEAR_FROM)) tt--;
if(dd < tt){
yy--;
if(((yy & 3) == 0) && (yy != (YEAR_DIFF - YEAR_FROM))) dd++;
dd += 365;
}
dd -= tt;
mm = 0;
while((mm < 12) && (dd >= DaysBeforeM[mm])) mm++;
dd -= DaysBeforeM[mm-1];
if((mm > 2) && ((yy & 3) == 0) && (yy != (YEAR_DIFF - YEAR_FROM))){
if(dd == 0){
mm--;
dd = (mm == 2) ? 29 : DaysBeforeM[mm] - DaysBeforeM[mm-1];
}
dd--;
}
dd++;
dt[0] = yy + YEAR_FROM;
dt[1] = mm;
dt[2] = dd;
}
#endif
|