static void weekofyear(int year,int month,int day, int *rtn_year,int *rtn_week,int *rtn_day) { int firstday=dayofweek(year,0,0); int doy=dayofyear(year,month,day); if(firstday>=5) { firstday-=7; if(firstday+doy<0) { weekofyear(year-1,12-1,31-1, rtn_year,rtn_week,rtn_day); *rtn_day+=doy+1; return; } } if(firstday!=4 && (firstday+doy)/7>=52) { *rtn_year=year+1; *rtn_week=0; *rtn_day=(firstday+doy)-52*7; } else { *rtn_year = year; *rtn_week = (firstday+doy)/7; *rtn_day = (firstday+doy)%7; } }
int weekofyear(struct tm localtime) { int wDayOnFirst; int wKYear; wDayOnFirst = localtime.tm_wday - (localtime.tm_yday%7); if(wDayOnFirst<0) wDayOnFirst += 7; wKYear = 1 + localtime.tm_yday / 7; if(wDayOnFirst>3) wKYear++; if(localtime.tm_wday==0) wKYear--; if(wKYear==0) { struct tm last = localtime; last.tm_year--; last.tm_wday--; if(last.tm_wday<0) last.tm_wday += 7; if((last.tm_year%4)==0) last.tm_yday = 365; else last.tm_yday = 364; wKYear = weekofyear(last); } return wKYear; }
void printweek(char *buf,const char *date) { int year; int month; int day; int yr; int wkn; int dny; buf[0]=0; if(!date[0]) return; numericdate(date,&year,&month,&day); weekofyear(year,month,day,&yr,&wkn,&dny); sprintf(buf,"%d",wkn+1); }
void printdate1w(char *buf,const char *date) { int year; int month; int day; int dow; int yr; int wkn; int dny; buf[0]=0; if(!date[0]) return; numericdate(date,&year,&month,&day); dow=dayofweek(year,month,day); weekofyear(year,month,day,&yr,&wkn,&dny); sprintf(buf,"%s %s %d wk%d",days[dow],months[month],day+1,wkn+1); }