我将当前周作为整数(截至目前为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);
答案 0 :(得分:2)
注意:未经测试,但考虑到当前年度,应该这样做:
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
值的指针,并截断它的输出,只显示星期几,月份的日期和月份名称的缩写。
答案 1 :(得分:2)
mktime
函数可以执行此操作。只需初始化struct tm foo
代表一年中的第一天(或一年中第一周的第一天,根据需要),然后将tm_hour
设置为24*7*weeknum
并致电{{1} }。它会为你标准化日期。