Неверный результат для определения того, в какой день недели выпадает первый день месяца
У меня есть следующий код 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;
}
Код возвращается в субботу, что неверно с 1 августа, 2018 - среда.
Я был бы очень признателен за любую помощь.
2 ответа
Есть ловушка в определении 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
означает, что вы смотрите 1 сентября, а не 1 августа (и 2018-09-01 действительно суббота).
Пытаться
tm.tm_mon = month - 1;
Вы можете увидеть здесь, что tm_mon
имеет диапазон 0-11.
Так что вам нужно вычесть 1 к tm_mon
при назначении его.
tm.tm_mon = month - 1;
Это должно решить вашу проблему.