C 星期几的strTime到strTime

C 星期几的strTime到strTime,c,time,strftime,strptime,C,Time,Strftime,Strptime,我在strtime中使用以下格式字符串 // 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); 调用strft

我在strtime中使用以下格式字符串

// 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后,输出字符串包含“”

我还需要在input_tm中填充哪些字段,以便strftime正常工作

编辑:

通过查看
strftime

所需的结构字段是
tm\u wday

如果我在调用
strftime
之前手动将
input\u tm.tm\u wday
设置为某个值,它会给我一个输出


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

这对我来说很有用-调用
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;
}
这与2014年cal 11的结果一致:

   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

最好提供一个可以编译的最小示例。仅供参考,
strftime
strftime
在计算方面做得很少;大多数格式仅直接存储或直接使用
struct tm
的一个字段。只有以周为基础的年度数据,可能还有其他一些模糊的格式,才能真正计算任何衍生数据。
strftime
的规范说明了它使用的字段。对于
strtime
,规范不太明确:(太棒了,在您发布此消息之前,我发现了关于
mktime
。感谢您的回答:)读者注意,在调用
mktime
之前,将tm结构初始化为0是非常重要的。这可能意味着使用
calloc
。实际上,在调用
strtime()
之前将其归零是至关重要的;如果您在调用
strtime()
之后和调用
mktime()
之前将其归零,您将被告知大约1970-01-01 00:00:00+00:00。注意,我的代码的第一个版本在
struct tm input_tm={0}中省略了初始值设定项,但我在宽限期结束前修复了这个问题。是的,您可以使用
calloc()
free()
;您还可以使用
memset()
   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