C — Как получить даты за неделю только из номера недели и года?

#c #time

Вопрос:

Я хотел бы, чтобы функция возвращала массив строк, где каждая дата представлена как «13/11» или в любом другом формате, откуда я могу извлечь как дату, так и месяц.
Может быть, это будет выглядеть примерно так:

 char** get_dates_from_year_and_week(int year, int week) {
    //Magic happens
    return arr
}
 
 get_dates_from_year_and_week(2021, 45);
//Would return ["08/11", "09/11", 10/11", "11/11", "12/11", "13/11", "14/11"];
 

Как это возможно получить с помощью c? Приветствуется любая библиотека.

Комментарии:

1. Используйте функции даты и времени, например mktime , localtime и strftime . Вы можете начать с struct tm использования только поля year (обратите внимание, что это год минус 1900). Затем вы конвертируете в time_t using mktime . Затем вы оцениваете неделю, добавляя количество секунд в неделю (7 * 24 * 60 * 60 ) умноженное на количество недель. Вы конвертируете обратно в struct tm using localtime . Затем вы можете использовать strftime , чтобы поместить дату в удобный формат. Обратите внимание, что strftime есть опция для номера недели, чтобы вы могли проверить, были ли ваши расчеты правильными.

Ответ №1:

Чтобы преобразовать год / неделю / (день недели) в год / месяц / день, найдите дату первого понедельника года, поскольку ISO 8601 неделя года начинается в понедельник. Затем добавьте week*7 к этому дни. Используется mktime() для определения дня недели (начиная с воскресенья) и для перевода даты вне диапазона в ее основной диапазон.

 #include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct {
  int year, month, day;
} ymd;

typedef struct {
  int year, week, dow; // ISO week-date: year, week 1-52,53, day-of-the-week 1-7
} ISO_week_date;

int ISO_week_date_to_ymd(ymd *y, const ISO_week_date *x) {
  // Set to noon, Jan 4 of the year.
  // Jan 4 is always in the 1st week of the year
  struct tm tm = {.tm_year = x->year - 1900, .tm_mon = 0, .tm_mday = 4,
      .tm_hour = 12};
  // Use mktime() to find the day-of-the week
  if (mktime(amp;tm) == -1) {
    return -1;
  }
  // Sunday to Jan 4
  int DaysSinceSunday = tm.tm_wday;
  // Monday to Jan 4
  int DaysSinceMonday = (DaysSinceSunday   (7 - 1)) % 7;
  tm.tm_mday  = (x->dow - 1)   (x->week - 1) * 7 - DaysSinceMonday;
  if (mktime(amp;tm) == -1) {
    return -1;
  }
  y->year = tm.tm_year   1900;
  y->month = tm.tm_mon   1;
  y->day = tm.tm_mday;
  return 0;
}
 

«массив строк» -> оставьте эту часть для выполнения OP.