Неверный результат для определения того, на какой день недели приходится первый день месяца.

У меня есть следующий код 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 года приходится на среду.

Буду очень признателен за любую помощь.


person Lambchop123    schedule 29.08.2018    source источник


Ответы (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;
person melpomene    schedule 29.08.2018

Вы можете видеть здесь, что tm_mon имеет диапазон от 0 до 11.

Поэтому вам нужно вычесть 1 из tm_mon при его назначении.

tm.tm_mon = month - 1;

Это должно решить вашу проблему.

person blue112    schedule 29.08.2018