2) 日期操作函数:
这些函数都和日期操作相关,具体请参考代码,注释应该比较清楚的。
void date_set(SDate* ret,int year,int month,int day)
{
assert(ret);
ret->year = year;
ret->month = month;
ret->day = day;
}
void date_get_now(SDate* ret)
{
assert(ret);
//time()此函数会返回从公元 1970 年1 月1 日的UTC 时间从0 时0 分0 秒算起到现在所经过的秒数。
//记住:是秒数,而不是毫秒数(很多语言返回的是毫秒数,crt中是以秒为单位的)
//如果t 并非空指针的话,此函数也会将返回值存到t指针所指的内存
time_t t;
time(&t);
//转换到当前系统的本地时间
struct tm* timeInfo;
timeInfo = localtime(&t);
//tm结构中的年份是从1900开始到今天的年数,因此需要加上1900
ret->year = timeInfo->tm_year + 1900;
//月份是 0 base的,我们按照1-12的方式来计算,因此加1
ret->month = timeInfo->tm_mon + 1;
ret->day = timeInfo->tm_mday;
}
bool date_is_equal(const SDate* left,const SDate* right)
{
assert(left&&right);
return (left->year == right->year &&
left->month == right->month &&
left->day == right->day);
}
int date_get_month_count_from_year_range(int startYear,int endYear)
{
int diff = endYear - startYear + 1;
return diff * 12;
}
void date_map_index_to_year_month(SDate* to,int startYear,int idx)
{
assert(to);
//每年有12个月,idx/12你可以看成每12个月进一位,加上startYear基准值,就可以获得当前年份
to->year = startYear + idx / 12;
//每年有12个月,idx%12你可以看成【0-11】之间循环,加1是因为我们的SDate结构是1-12表示的
to->month = idx % 12 + 1;
//至于day,这里为-1,我们在map中忽略该值,可以设置任意值
to->day = -1;
}
long mymktime (unsigned int year, unsigned int mon,
unsigned int day, unsigned int hour,
unsigned int min, unsigned int sec)
{
if (0 >= (int) (mon -= 2)) {
mon += 12;
year -= 1;
}
return (((
(long) (year/4 - year/100 + year/400 + 367*mon/12 + day) +
year*365 - 719499
)*24 + hour
)*60 + min
)*60 + sec;
}
long date_get_time_t(const SDate* d)
{
assert(d);
return mymktime(d->year,d->month,d->day,0,0,1);
}
void date_get_prev_month(SDate* date, int delta)
{
assert(date);
if((date->month - delta) < 1)
{
//条件: 假设为2015年1月,delta = 2
//因为: 1-2 = -1 < 1
//所以: 年数 = 2015 - 1 = 2014 月份 = 12 + 1 - 2 = 11
date->year--;
date->month = 12 + date->month - delta;
}
else
date->month = date->month - delta;
}
void date_get_next_month(SDate* date, int delta)
{
assert(date);
if((date->month + delta) > 12)
{
//条件: 假设为2015年11月,delta = 2
//因为: 11 + 2 = 13 > 12
//所以: 年数 = 2015 + 1 = 2016 月份 = 11 + 2 - 12 = 1
date->year++;
date->month = date->month + delta - 12;
}
else
date->month = date->month + delta;
}
int date_get_leap(int year)
{
if(((year % 4 == 0) && (year % 100) != 0) (year % 400 == 0))
return 1;
return 0;
}
int date_get_days(const SDate* date)
{
assert(date);
int day_table[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int i = 0, total = 0;
for(i = 0; i < date->month; i++)
total += day_table[i];
return total + date->day + date_get_leap(date->year);
}
int date_get_week(const SDate* date)
{
assert(date);
return ((date->year - 1 + (date->year - 1) / 4 - (date->year - 1) / 100 +
(date->year - 1) / 400 + date_get_days(date) )% 7);
}
int date_get_month_of_day(int year, int month)
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: return 31;
case 4:
case 6:
case 9:
case 11: return 30;
}
//blf:2月比较特别,要进行闰年判断
return 28 + date_get_leap(year);
}


