Возможно, вам стоит посмотреть на boost::date_time::gregorian. С его помощью вы можете написать функцию так:
#include <boost/date_time/gregorian/gregorian.hpp>
// Get the date for a given year, week and weekday(0-6)
time_t *GetDateFromWeekNumber(int year, int week, int dayOfWeek)
{
using namespace boost::gregorian;
date d(year, Jan, 1);
int curWeekDay = d.day_of_week();
d += date_duration((week - 1) * 7) + date_duration(dayOfWeek - curWeekDay);
tm tmp = to_tm(d);
time_t * ret = new time_t(mktime(&tmp));
return ret;
}
К сожалению, их формат даты отличается от вашего - они нумеруют дни недели, начиная с воскресенья, то есть Sunday = 0, Monday = 1, ..., Saturday = 6
. Если он не удовлетворяет вашим потребностям, вы можете использовать эту слегка измененную функцию:
#include <boost/date_time/gregorian/gregorian.hpp>
// Get the date for a given year, week and weekday(1-7)
time_t *GetDateFromWeekNumber(int year, int week, int dayOfWeek)
{
using namespace boost::gregorian;
date d(year, Jan, 1);
if(dayOfWeek == 7) {
dayOfWeek = 0;
week++;
}
int curWeekDay = d.day_of_week();
d += date_duration((week - 1) * 7) + date_duration(dayOfWeek - curWeekDay);
tm tmp = to_tm(d);
time_t * ret = new time_t(mktime(&tmp));
return ret;
}
EDIT:
Подумав немного, я нашел способ реализовать ту же функцию, не используя импульс. Вот код:
ВНИМАНИЕ: приведенный ниже код не работает, не используйте его!
// Get the date for a given year, week and weekday(1-7)
time_t *GetDateFromWeekNumber(int year, int week, int dayOfWeek)
{
const time_t SEC_PER_DAY = 60*60*24;
if(week_day == 7) {
week_day = 0;
week++;
}
struct tm timeinfo;
memset(&timeinfo, 0, sizeof(tm));
timeinfo.tm_year = year - 1900;
timeinfo.tm_mon = 0;
timeinfo.tm_mday = 1;
time_t * ret = new time_t(mktime(&timeinfo)); // set all the other fields
int cur_week_day = timeinfo.tm_wday;
*ret += sec_per_day * ((week_day - cur_week_day) + (week - 1) * 7);
return ret;
}
EDIT2:
Да, код в EDIT полностью сломана, потому что я не принимал достаточно времени, чтобы понять, как номера недели назначены.
Я не нашел ни одного алгоритма, который работает в Интернете. – 2013-03-28 20:33:51
Вам может понравиться [статья о юлианских датах в Википедии] (http://en.wikipedia.org/wiki/Julian_date). – pmg
В ответ на [Как рассчитать номер недели с датой?] (Http://stackoverflow.com/questions/274861/how-do-i-calculate-the-week-number-given-a -date/275024 # 275024). Это не в C, но он довольно легко понятен и не требует больших усилий для преобразования. Кроме того, ['strftime()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/strftime.html) поддерживает форматирование ('% W','% U', '% V' и т. Д.). –