开发遇到一个需求,需要由一个linux时间戳,计算出这个时间戳所处于的一周的每一天,具体实现:先由linux系统调用将这个时间戳转换为具体的年月日,再根据这天是周几,不断往前递减一天直到周一,同理再往后不断+1天,直到周日,编码时主要的难点是考虑边界条件:润平年、2月份。
#include
#include
#include
#include
#define OK 0
#define ERROR 1
#define TRUE 1
#define FALSE 0
#define WEEK_MAX 7
//润平年判断
int Leapyear(int year)
{
if ( ((0 == year%4) && (0 != year%100)) ||(0 == year %400) )
{
return TRUE;
}
return FALSE;
}
/润平年每个月份的天数
const int dayofmonth[2][12] = {{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
//这个接口只是通过具体的年月日+设定的时分秒统一为5后,转化成时间戳,
int spectime2linuxtime(int year, int month, int day)
{
int time;
struct tm tm_t; //xxxx-xx-xx 05:05:05
memset(&tm_t,0,sizeof(struct tm));
tm_t.tm_sec = 5;
tm_t.tm_min = 5;
tm_t.tm_hour = 5;
tm_t.tm_mday = day;
tm_t.tm_mon = month-1;
tm_t.tm_year = year - 1900;
time =(int)mktime(&tm_t);
//printf("time:%d\n",time);
return time;
}
int GetAWeekFromOneDay(time_t time1,int *weekarray)
{
int dayth1 = 0;
int year = 0,month = 0,day = 0;
int iRet = ERROR;
int beyondCnt = 0,backCnt = 0;
time_t tmptime = 0;
#if 0 //结构体 struct tm的成员
struct tm
{
int tm_sec; /* Seconds (0-60) */
int tm_min; /* Minutes (0-59) */
int tm_hour; /* Hours (0-23) */
int tm_mday; /* Day of the month (1-31) */
int tm_mon; /* Month (0-11) */
int tm_year; /* year - 1900 */
int tm_wday; /* Day of the week (0-6, Sunday = 0) */
int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */
int tm_isdst; /* Daylight saving time */
};
#endif
int tmpday = 0,tmpmonth = 0,tmpyear = 0,tmpVardayth = 0;
int tmpdayth1;
int tmpseg1min;
int tmpseg1max;
int leapIndex = 0;
struct tm *tm1 = NULL;
tm1 = localtime(&time1);
year = tm1->tm_year + 1900;
month = tm1->tm_mon + 1; //1-12
day = tm1->tm_mday; //1-31 day of the month
dayth1 = ((tm1->tm_wday == 0)?7:tm1->tm_wday); //day of week (0~6 : 周日~周六)
tmpdayth1 = dayth1; //((tm1->tm_wday == 0)?7:tm1->tm_wday);
tmpseg1min = tmpdayth1 - 1; //确定当前天处于星期几,往前推 tmpseg1min 天到星期一,往后推 tmpseg1max 天到星期日
tmpseg1max = 7 - tmpdayth1;
tmpmonth = month;
tmpyear = year;
tmpday = day;
tmpVardayth = dayth1 -1;
weekarray[tmpVardayth] = time1;//已知的当天日期先占位
//(1).往前推,直至周一
for (beyondCnt = 0 ; beyondCnt < tmpseg1min ; beyondCnt++)//将此天所处一周的位置逐一向前推一天直到周一
{
tmpday -= 1;
if (tmpday <= 0)
{
tmpmonth -= 1;
if (tmpmonth <= 0)
{
tmpmonth = 12;
tmpyear -= 1;
}
if (Leapyear(tmpyear) == TRUE)
{//闰年
leapIndex = 1;
}
else
{
leapIndex = 0;
}
tmpday = dayofmonth[leapIndex][tmpmonth-1];
}
if ((tmptime = spectime2linuxtime(tmpyear,tmpmonth,tmpday)) < 0)
{//不合法日期,直接返回
return iRet;
}
else
{
weekarray[--tmpVardayth] = tmptime;
}
}
//归位
tmpmonth = month;
tmpyear = year;
tmpday = day;
tmpVardayth = dayth1 -1;
//(2).往后推,直至周日
for (backCnt = 0; backCnt < tmpseg1max; backCnt++)//将此天所处周的位置周几,逐一向后推一天直到周日
{
tmpday += 1;
if (Leapyear(tmpyear) == TRUE)
{
leapIndex = 1;
}
else
{
leapIndex = 0;
}
if (tmpday > dayofmonth[leapIndex][tmpmonth-1])
{
tmpday = 1;
tmpmonth += 1;
if (tmpmonth > 12)
{
tmpmonth = 1;
tmpyear += 1;
}
}
if ( ( weekarray[++tmpVardayth] = (spectime2linuxtime(tmpyear,tmpmonth,tmpday))) < 0)
{//不合法日期,直接返回
return iRet;
}
}
iRet = OK;
return iRet;
}
int main()
{
time_t time1,time2,time3,time4;
#if 1 //测试数据
time1 = spectime2linuxtime(2020,5,31); //2020-5-31 5:5:5
time2 = spectime2linuxtime(2000,4,30); //2000-4-30 5:5:5
time4 = spectime2linuxtime(2020,1,12); //2020-1-12 5:5:5
time3 = spectime2linuxtime(2020,5,1); //2020-5-1 5:5:5
#endif
int weekarray[WEEK_MAX] = {0};
#if 1 //测试结果打印
GetAWeekFromOneDay(time1,weekarray);
printf("%d\n%d\n%d\n%d\n%d\n%d\n%d\n\n\n",
weekarray[0],
weekarray[1],
weekarray[2],
weekarray[3],
weekarray[4],
weekarray[5],
weekarray[6]);
GetAWeekFromOneDay(time2,weekarray);
printf("%d\n%d\n%d\n%d\n%d\n%d\n%d\n\n\n",
weekarray[0],
weekarray[1],
weekarray[2],
weekarray[3],
weekarray[4],
weekarray[5],
weekarray[6]);
GetAWeekFromOneDay(time4,weekarray);
printf("%d\n%d\n%d\n%d\n%d\n%d\n%d\n\n\n",
weekarray[0],
weekarray[1],
weekarray[2],
weekarray[3],
weekarray[4],
weekarray[5],
weekarray[6]);
GetAWeekFromOneDay(time3,weekarray);
printf("%d\n%d\n%d\n%d\n%d\n%d\n%d\n\n\n",
weekarray[0],
weekarray[1],
weekarray[2],
weekarray[3],
weekarray[4],
weekarray[5],
weekarray[6]);
#endif
return 0;
}