返回星期几以及提供的日期,月份,年份和一月一日?

时间:2018-11-06 16:28:21

标签: c

我的C99如下:

int dayOfWeek(int day, int month, int year, int firstJan);

第一个参数day提供了感兴趣的日期-范围从1到31(含1和31)。第二个参数,month,提供感兴趣的月份-范围从1到12(含1和12)。第三个参数,年份,提供感兴趣的年份-1970年或更高的任何整数。第四个参数firstJan表示所提供年份中的1月1日所在的星期几。

该函数将返回指定日期所在的星期几。例如,呼叫:

dayOfWeek(13, 11, 2017, 0);

将返回整数1(代表星期一)。

我该如何解决?它的允许值为0(代表星期日),1(代表星期一),依此类推,直到6(代表星期六)。代码已被编辑:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 int dayOfweek(int day, int month, int year, int firstJan)
  5 {
  6         int mth[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
  7         int mth_leap[] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335};
  8 
  9         if(year <1970 || month < 1 || month > 12 || day < 1 || day > 31 || firstJan < 0 || firstJan > 6 ){
 10         printf("invalid input");
 11         //return -1;
 12         }
 13 
 14         if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)){
 15                 day = mth_leap[month - 1] + day ;
 16         }else{
 17                 day = mth[month - 1] + day;
 18         }
 19 
 20         int dow = (day - firstJan + 7)%7;
 21         printf("Day of week is %i.\n", dow);
 22         //return 1;
 23 
 24 }

1 个答案:

答案 0 :(得分:2)

使用mktime()可以轻松找到星期几。

mktime函数

  

成功完成后,将适当设置结构的tm_wdaytm_yday组件的值,并将其他组件设置为代表指定的日历时间,

#include <time.h>

int dayOfWeek(int day, int month, int year, int /*firstJan*/) {
   // struct tm members domain are: years from 1900, and months since January
   // Important to set tm_isdst = -1 to let the function determine dst setting.
   struct tm ymd = { .tm_year - 1900, .tm_mon = month - 1, .tm_mday = day, .tm_isdst = -1);

   time_t t = mktime(&ymd);  // this will fill in .tm_wday
   if (t == -1) return -1;  // Failed to find a valid calender time (and day-of-the-week)
   return ymd.tm_wday;
}

  

我该如何解决?

但是OP具有提供1月1日星期几的功能。

该方法的一些伪代码:

int dayOfWeek(int day, int month, int year, int firstJan) {
  days_since_jan1 = table[month] + day;
  if (month > Feb and isleap(year)) days_since_jan1++;
  dow = (days_since_jan1 - firstJan + 7)%7
}