获得给定周的第一天

时间:2010-10-30 17:35:22

标签: c

我将当前周作为整数(截至目前为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);

2 个答案:

答案 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} }。它会为你标准化日期。