获得给定周的第一天

我将当前周作为整数(截至目前为43)。 我需要星期一的日期,格式为’Mon Oct 25’。

以为我可以通过一个函数完成它,但我不知道该怎么做。 有什么建议?

编辑:我尝试了R.的建议,但它没有给出预期的结果。 我做错了吗?

time_t monday; char date_format[32]; time_t now = time(NULL); struct tm *tm = localtime(&now); tm->tm_yday = 0; // reset to Jan 1st tm->tm_hour = 24 * 7 * WEEK + 24; // goto Sun and add 24h for Mon monday = mktime(tm); strftime(date_format, 31, "%a : %D", tm); printf("%s\n", date_format); 

注意:未经测试,但考虑到当前年度,应该这样做:

 const char *months[12]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep", "Oct","Nov","dec","Jan"}; /* Start with January 1st of the current year */ struct tm curYear={ 0, // secs 0, // mins 0, // hours 1, // Day of month 0, // Month (Jan) year, 0, // wday 0, // yday 0}; // isdst /* Offset the number of weeks specified */ time_t secsSinceEpoch=mktime(&curYear)+ weekNum*86400*7; /* Shift by number of weeks */ struct tm *candidateDate=gmtime(&secsSinceEpoch); /* If the candidate date is not a Monday, shift it so that it is */ if (candidateDate->tm_wday!=1) { secsSinceEpoch+=(86400*(candidateDate->tm_wday-1)); candidateDate=gmtime(&secsSinceEpoch); } printf("Mon %s %d",months[candidateDate->tm_mon],candidateDate->tm_mday\n"); 

您可能需要调整此代码中的公式,具体取决于您在给定年份的第43周时的确切含义或符合ISO-8601。 但是,这应该为您提供良好的锅炉板代码以便入门。 您可能还想参数化星期几,以便它不是硬编码的。

此外,如果需要,您可以通过截断ctime函数的结果来避免使用月数组并且必须格式化时间,这恰好比您要求的更多地显示。 您将向其传递一个指向secsSinceEpoch值的指针,并截断其输出以仅显示星期几,月份日期和月份名称的缩写。

mktime函数可以做到这一点。 只需初始化struct tm foo以表示一年中的第一天(或一年中第一周的第一天,根据需要),然后将tm_hour设置为24*7*weeknum并调用mktime 。 它会为您规范日期。