对于星期几的strftime来说

时间:2014-03-24 02:39:44

标签: c time strftime strptime

我使用以下格式字符串和strptime

// Populates input_tm with an input string of Monthname Date, Year
strptime(input_string, "%B %d, %Y", &input_tm);

// Output the day of the week from input_tm
strftime(output_string, TIME_BUFSZ, "%A", &input_tm);

在调用strftime之后,output_string包含"?"

我需要在input_tm中填充哪些其他字段才能使用strftime?

修改

通过查看strftime

的来源来计算出来

所需的结构字段为tm_wday

如果我在调用input_tm.tm_wday之前手动将strftime设置为某个内容,则会为我提供输出。

所以现在我的问题是,是否有一个标准的C函数可以计算给定日期的工作日?

1 个答案:

答案 0 :(得分:2)

这对我有用 - 对mktime()的调用可以解决您遇到的问题:

#include <stdio.h>
#include <time.h>

enum { TIME_BUFSZ = 256 };

int main(void)
{
    char input_string[] = "November 18, 2014";
    char output_string[TIME_BUFSZ];

    struct tm input_tm = { 0 };
    char *end = strptime(input_string, "%B %d, %Y", &input_tm);
    if (*end != '\0')
        printf("Unused data: [[%s]]\n", end);

    printf("tm_year = %d; tm_mon = %d; tm_mday = %d; tm_wday = %d; tm_yday = %d\n",
            input_tm.tm_year, input_tm.tm_mon, input_tm.tm_mday,
            input_tm.tm_wday, input_tm.tm_yday);
    time_t t0 = mktime(&input_tm);
    printf("tm_year = %d; tm_mon = %d; tm_mday = %d; tm_wday = %d; tm_yday = %d\n",
            input_tm.tm_year, input_tm.tm_mon, input_tm.tm_mday,
            input_tm.tm_wday, input_tm.tm_yday);
    printf("t0 = %lld\n", (long long)t0);

    size_t nbytes = strftime(output_string, TIME_BUFSZ, "%A", &input_tm);

    printf("in: [[%s]]\n", input_string);
    printf("out (%zu): [[%s]]\n", nbytes, output_string);
    return 0;
}

运行示例(Mac OS X 10.9.2 Mavericks上的GCC 4.8.2):

tm_year = 114; tm_mon = 10; tm_mday = 18; tm_wday = 0; tm_yday = 0
tm_year = 114; tm_mon = 10; tm_mday = 18; tm_wday = 2; tm_yday = 321
t0 = 1416297600
in: [[November 18, 2014]]
out (7): [[Tuesday]]

这与cal 11 2014

的结果一致
   November 2014
Su Mo Tu We Th Fr Sa
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30