查找一个月的第一天是星期几的错误结果

时间:2018-08-29 10:41:48

标签: c time.h

我有以下C代码:

#include <stdio.h>
#include <time.h>
struct tm tm;
int startDayOfWeek;
int findStartDateInMonth(int month,int year)       
{
    tm.tm_mon = month;
    tm.tm_year = year - 1900;
    tm.tm_mday = 1;
    tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
    tm.tm_isdst = -1;
    if(mktime(&tm) != -1)
    {
        startDayOfWeek = tm.tm_wday;
    }
    return startDayOfWeek;
}
int main(void) {

char *wday[] = {"Sunday", "Monday", "Tuesday", "Wednesday",
        "Thursday", "Friday", "Saturday"};
int a = findStartDateInMonth(8,2018);
if(mktime(&tm) != -1)
    printf("%s\n", wday[tm.tm_wday]);
  return 0;
}

代码返回星期六,这是错误的,因为2018年8月1日是星期三。

我将非常感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

struct tm的定义中有一个陷阱:

int tm_mday; // day of the month — [1, 31]
int tm_mon;  // months since January — [0, 11]

也就是说,tm_mday是基于1的,而tm_mon是基于0的。将其设置为8意味着您正在看9月1日,而不是8月1日(而2018-09-01确实是星期六)。

尝试

tm.tm_mon = month - 1;

答案 1 :(得分:1)

You can see here tm_mon的范围是0-11。

因此,在分配tm_mon时需要减去1。

tm.tm_mon = month - 1;

这应该可以解决您的问题。