点击(此处)折叠或打开
-
#include <stdio.h>
-
-
/**/
-
typedef struct _date_time_{
-
unsigned char year;/*[0,99]*/
-
unsigned char mon;/*[1,12]*/
-
unsigned char mday;/*[1,31]*/
-
unsigned char hour;/*[0,23]*/
-
unsigned char min;/*[0,59]*/
-
unsigned char sec;/*[0,59]*/
-
unsigned char week;/*[0,6]*/
-
}date_time_t;
-
-
-
/*
-
这个函数将时间转换成从1970年1月1日0小时0分0秒到你输入的时间所经过的秒数,溢出时间为2106-02-07 06:28:16。
-
若你要计算2000-02-07 06:28:16 到2000-02-09 06:28:16 所经过的秒数:
-
unsigned long time1 = Dt_mktime_abs(2000, 2, 7, 6, 28, 16) - Dt_mktime_abs(2000, 2, 9, 6, 28, 16)
-
*/
-
unsigned long Dt_mktime_abs(date_time_t *pTm)
-
{
-
int year/*[2000, 2099]*/ = pTm->tm_year/*[00, 99]*/ + 2000;
-
int mon/*[1, 12]*/ = pTm->tm_mon/*[1, 12]*/;
-
int day/*[1, 31]*/ = pTm->tm_mday/*[1, 31]*/;
-
int hour = pTm->tm_hour/*[0, 23]*/;
-
int min = pTm->tm_min/*[0, 59]*/;
-
int sec = pTm->tm_sec/*[0, 59]*/;
-
-
/**/
-
if(((int)(mon -= 2)) <= 0)
-
{
-
mon += 12;/* Puts Feb last since it has leap day */
-
year -= 1;
-
}
-
-
return ((((unsigned long)(year / 4 - year / 100 + year / 400 + 367 * mon / 12 + day) + year * 365 - 719499) * 24
-
+ hour /* now have hours */) * 60 + min /* now have minutes */)*60 + sec; /* finally seconds */
-
}
-
-
-
/**/
-
int Calc_week_day( unsigned int year/*[2000, 2099]*/, unsigned int mon/*[1, 12]*/, unsigned int day/*[1, 31]*/)
-
{
-
int week = 0;
-
unsigned int y = 0;
-
unsigned int c = 0;
-
unsigned int m = 0;
-
unsigned int d = 0;
-
-
if((mon == 1) || (mon == 2))
-
{
-
c = ( year - 1 ) / 100;
-
y = ( year - 1 ) % 100;
-
m = mon + 12;
-
d = day;
-
}
-
else
-
{
-
c = year / 100;
-
y = year % 100;
-
m = mon;
-
d = day;
-
}
-
-
week = y + y / 4 + c / 4 - 2 * c + 26 * ( m + 1 ) / 10 + d - 1; //蔡勒公式
-
week = week >= 0 ? ( week % 7 ) : ( week % 7 + 7 ); //week为负时取模
-
-
return week;
-
}
-
-
-
/*
-
1:leap year
-
0:not leap year
-
*/
-
int Is_leap_year(unsigned int year)
-
{
-
if(((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
-
{
-
return 1;
-
}
-
else
-
{
-
return 0;
-
}
-
}
-
-
/*
-
The number of days in the month.
-
*/
-
unsigned char Get_days_in_month(unsigned int year, unsigned int mon/*[1,12]*/)
-
{
-
unsigned char day_table[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
-
if((mon == 2) && (is_leap_year(year) == 1))
-
{
-
return 29;
-
}
-
else
-
{
-
return day_table[mon];
-
}
-
}
-
-
/*
-
* Convert seconds since 01-01-1970 00:00:00 to date.
-
*/
-
void Dt_time_to_tm(unsigned long time, date_time_t *pTm)
-
{
-
unsigned int month = 0;
-
unsigned int year = 0;
-
int days = 0;
-
int tm_year = 0;
-
int tm_mon = 0;
-
int tm_mday = 0;
-
int tm_hour = 0;
-
int tm_min = 0;
-
int tm_sec = 0;
-
int newdays = 0;
-
-
/**/
-
#define LEAPS_THRU_END_OF(y) ((y)/4 - (y)/100 + (y)/400)
-
-
/**/
-
days = time / 86400;
-
time -= (unsigned int)days * 86400;
-
year = 1970 + days / 365;
-
days -= (year - 1970) * 365 + LEAPS_THRU_END_OF(year - 1) - LEAPS_THRU_END_OF(1970 - 1);
-
if (days < 0)
-
{
-
year -= 1;
-
days += 365 + is_leap_year(year);
-
}
-
tm_year = year - 1900;
-
for (month = 0; month < 11; month++)
-
{
-
newdays = days - rtc_month_days(month, year);
-
if (newdays < 0)
-
{
-
break;
-
}
-
days = newdays;
-
}
-
tm_mon = month;
-
tm_mday = days + 1;
-
tm_hour = time / 3600;
-
time -= tm_hour * 3600;
-
tm_min = time / 60;
-
tm_sec = time - tm_min * 60;
-
-
/**/
-
pTm->year = (unsigned char)(tm_year - 100);
-
pTm->mon = (unsigned char)(tm_mon + 1);
-
pTm->mday = (unsigned char)(tm_mday);
-
pTm->hour = (unsigned char)(tm_hour);
-
pTm->min = (unsigned char)(tm_min);
-
pTm->sec = (unsigned char)(tm_sec);
-
-
/**/
-
pTm->week = (unsigned char)Calc_week_day(pTm->year + 2000, pTm->mon, pTm->mday);
-
}
-
-
-
/**/
-
int Dt_get_day_by_week(unsigned char year/*[0, 99]*/, unsigned char month/*[1, 12]*/,
-
unsigned char week_index/*>= 1*/, unsigned char week_day/*[0, 6]*/)
-
{
-
/**/
-
unsigned char week_day_ = 0;
-
unsigned char day = 0;
-
-
/**/
-
if(!((year <= 99) && ((month >= 1) && (month <= 12)) && (week_index >= 1) &&
-
(week_day <= 6)))
-
{
-
printf("Invalid parameter(%d, %d, %d, %d)\r\n", year, month, week_index, week_day);
-
return -1;
-
}
-
/*计算这个月的1号是星期几*/
-
week_day_ = Calc_week_day(year + 2000, month, 1);
-
/**/
-
if(week_day >= week_day_)
-
{
-
day = week_day - week_day_ + 1;
-
}
-
else
-
{
-
day = 8 - week_day_ + week_day;
-
}
-
/**/
-
day += (week_index - 1) * 7;
-
-
/**/
-
if(day > Get_days_in_month(year, month))
-
{
-
printf("Invalid result(%d, %d, %d, %d, %d)\r\n", year, month, week_index, week_day, day);
-
return -1;
-
}
-
-
/**/
-
return day;
- }