Skip to content

Instantly share code, notes, and snippets.

@gogomako
Created December 24, 2015 08:06
Show Gist options
  • Select an option

  • Save gogomako/04b18f73b82bf9495998 to your computer and use it in GitHub Desktop.

Select an option

Save gogomako/04b18f73b82bf9495998 to your computer and use it in GitHub Desktop.
萬年曆。從2000年起算,0代表星期一,6代表星期日。
#include<stdio.h>
#include<stdlib.h>
int is_leap_year(int year){
if((year - 2000)%400==0)
return 1;
else if((year - 2000)%100 == 0)
return 0;
else if((year - 2000)%4 == 0)
return 1;
else
return 0;
}
int cal_week_day(int year, int month, int day){
const int year2000_start_week_day = 5;//0-base, 2000/1/1 is Saturday
int year_start_week_day = 0;//week day of JAN 1st
int week_day = 0;
int common_year_week_day_offset[12] = {0,3,3,6,1,4,6,2,5,0,3,5};
int leap_year_week_day_offset[12] = {0,3,4,0,2,5,0,3,6,1,4,6};
//find the start week day of the year
year_start_week_day = year2000_start_week_day;
if(year > 2000){
year_start_week_day += (year - 2000)*365;
year_start_week_day += 1;//because 1/1-12/31 is 365 days, the 1/1 of next year is the 366th day.
}
if(year - 2000 >= 4){
year_start_week_day += (year - 2000) / 4;
}
if(year - 2000 >= 100){
year_start_week_day -= (year - 2000) / 100;
}
if(year - 2000 >= 400){
year_start_week_day += (year - 2000) / 400;
}
year_start_week_day %= 7;
//find week day
if(is_leap_year(year)){
week_day = (year_start_week_day + leap_year_week_day_offset[month-1] + (day-1))%7;
}else{
week_day = (year_start_week_day + common_year_week_day_offset[month-1] + (day-1))%7;
}
return week_day;
}
int main(int argc, char* argv[]){
int year = atoi(argv[1]);
int month = atoi(argv[2]);
int day = atoi(argv[3]);
//printf("%d/%d/%d week day(1-7):%d\n",year,month,day,cal_week_day(year,month,day)+1);
printf("%d/%d/%d week day(0-6):%d\n",year,month,day,cal_week_day(year,month,day));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment