也许你应该看一下
boost::date_time::gregorian。使用它,你可以编写这样一个函数:
#include <boost/date_time/gregorian/gregorian.hpp>
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;
}
很遗憾,他们的日期格式与您的不同 - 他们从星期日开始编号,即
星期日 = 0,星期一 = 1,...,星期六 = 6
。如果这不能满足您的需求,您可以使用这个稍微改变的函数:
#include <boost/date_time/gregorian/gregorian.hpp>
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;
}
编辑:
经过思考,我找到了一种不使用boost也可以实现相同功能的方法。以下是代码:
警告:下面的代码有问题,请勿使用!
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));
int cur_week_day = timeinfo.tm_wday;
*ret += sec_per_day * ((week_day - cur_week_day) + (week - 1) * 7);
return ret;
}
编辑2:
是的,编辑中的代码完全失效,因为我没有花足够的时间了解如何分配周数。