Created
December 24, 2015 08:06
-
-
Save gogomako/04b18f73b82bf9495998 to your computer and use it in GitHub Desktop.
萬年曆。從2000年起算,0代表星期一,6代表星期日。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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