fork download
  1. #include <stdio.h>
  2. #include <time.h>
  3.  
  4. int days_between (struct tm *tsa, struct tm *tsb) {
  5. time_t a = mktime(tsa);
  6. time_t b = mktime(tsb);
  7. return (b - a)/(60*60*24);
  8. }
  9.  
  10. int days_of_year (int y) {
  11. struct tm tsa = {0};
  12. struct tm tsb = {0};
  13.  
  14. tsa.tm_mday = 1;
  15. tsa.tm_year = y - 1900;
  16.  
  17. tsb.tm_mday = 1;
  18. tsb.tm_year = y + 1 - 1900;
  19.  
  20. return days_between(&tsa, &tsb);
  21. }
  22.  
  23. int days_of_month (int m, int y, int *weekdays) {
  24. struct tm tsa = {0};
  25. struct tm tsb = {0};
  26. int days;
  27.  
  28. tsa.tm_mday = 1;
  29. tsa.tm_mon = m - 1;
  30. tsa.tm_year = y - 1900;
  31.  
  32. tsb.tm_mday = 1;
  33. tsb.tm_mon = m;
  34. tsb.tm_year = y - 1900;
  35.  
  36. days = days_between(&tsa, &tsb);
  37. if (weekdays) {
  38. int dss = tsa.tm_wday;
  39. *weekdays = 8;
  40. switch (days) {
  41. case 31: if (dss == 0 || dss == 6) *weekdays += 1;
  42. dss = (dss + 1) % 7;
  43. case 30: if (dss == 0 || dss == 6) *weekdays += 1;
  44. dss = (dss + 1) % 7;
  45. case 29: if (dss == 0 || dss == 6) *weekdays += 1;
  46. default: break;
  47. }
  48. }
  49. return days;
  50. }
  51.  
  52. void print_days_info (int m, int y) {
  53. int w;
  54. int d = days_of_month(m, y, &w);
  55.  
  56. printf("%d-%d: days: %d, weekdays: %d, days in year: %d\n",
  57. m, y, d, w, days_of_year(y));
  58. }
  59.  
  60. int main (int argc, char *argv[]) {
  61.  
  62. print_days_info(8, 2012);
  63. print_days_info(9, 2012);
  64. print_days_info(10, 2012);
  65. print_days_info(11, 2012);
  66. print_days_info(12, 2012);
  67. print_days_info(1, 2013);
  68. return 0;
  69. }
  70.  
Success #stdin #stdout 0.01s 1808KB
stdin
Standard input is empty
stdout
8-2012: days: 31, weekdays: 8, days in year: 366
9-2012: days: 30, weekdays: 10, days in year: 366
10-2012: days: 31, weekdays: 8, days in year: 366
11-2012: days: 30, weekdays: 8, days in year: 366
12-2012: days: 31, weekdays: 10, days in year: 366
1-2013: days: 31, weekdays: 8, days in year: 365