首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >strftime发布星期几

strftime发布星期几
EN

Stack Overflow用户
提问于 2012-10-09 10:24:49
回答 3查看 271关注 0票数 1
代码语言:javascript
运行
复制
        char buffer[800];
        struct tm str_time;

        str_time.tm_mday = Cur_Day;
        str_time.tm_mon = Cur_Month - 1;
        str_time.tm_year = entries[i].Year_Start - 1900;
        int len = strftime(buffer, 100, "%A, %d %B %Y", &str_time);
        printf("\n%s\n", buffer);

不管Cur_Day和Cur_Month的值是什么,一周中的某一天都是星期天,上面的结果是什么?

示例输出:

代码语言:javascript
运行
复制
Sunday, 23 November 2012
------------------------
stuff

Sunday, 25 November 2012
------------------------
stuff

Sunday, 26 November 2012
------------------------
stuff
EN

回答 3

Stack Overflow用户

发布于 2012-10-09 10:31:12

您的str_time结构(如果它看起来是一个局部变量)的字段中有不确定的值,除非您显式地设置它们。strftime所做的只是使用它拥有的值,它不会首先调整值以符合其他字段。

因为您没有设置tm_wday,所以它将保留原来的值(从外观上看是0,因为它总是星期天)。

如果您确实希望根据其他字段调整字段,则应该查看mktime()

从标准(ISO C99):

mktime函数将timeptr指向的结构中的故障时间(表示为本地时间)转换为日历时间值,其编码与time函数返回的值的编码相同。

结构的tm_wday和tm_yday分量的原始值被忽略,其他分量的原始值不限于上述范围。

成功完成后,将相应地设置结构的tm_wday和tm_yday组件的值,并将其他组件设置为表示指定的日历时间,但将它们的值强制设置为上述范围;直到确定了tm_mon和tm_year,才会设置tm_mday的最终值。

最好的方法是使用time()localtime()填充tm结构,然后在调用mktime()之前更改要更改的字段。这样,您就可以保证所有字段都有合理的值。

下面的程序展示了一种实现此目的的方法:

代码语言:javascript
运行
复制
#include <stdio.h>
#include <time.h>

int main (void) {
    char buffer[100];
    time_t now;
    struct tm *ts;

    // Get today in local time and output it.

    now = time (NULL);
    struct tm *ts = localtime (&now);
    strftime (buffer, 100, "%A, %d %B %Y", ts);
    printf ("Now      = %s\n", buffer);

    // Advance day-of-month and make new date.
    // Probably need to intelligently handle month rollover.

    ts->tm_mday++;
    mktime (ts);
    strftime (buffer, 100, "%A, %d %B %Y", ts);
    printf ("Tomorrow = %s\n", buffer);

    return 0;
}

该程序的输出为:

代码语言:javascript
运行
复制
Now      = Tuesday, 09 October 2012
Tomorrow = Wednesday, 10 October 2012

无论如何,这里有一个完整的程序,它使用该方法为您提供给定日期的星期几(默认为今天)。

您可以使用可选的-y-m-d参数按任意顺序和次数更改年份、月份和月份的日期,尽管每种类型只有最后一次有效。

代码语言:javascript
运行
复制
#include <stdio.h>
#include <time.h>

static int makeError (char *argVal, char *errStr) {
    printf ("Error with argument '%s': %s\n", argVal, errStr);
    printf ("Usage: dow [-y<year>] [-m<month>] [-d<day>]\n");
    return 1;
}

int main (int argc, char *argv[]) {
    int idx, intVal;
    char chVal;
    char buff[100];
    time_t now = time (NULL);
    struct tm *nowStr = localtime (&now);

    for (idx = 1; idx < argc; idx++) {
        chVal = (*argv[idx] != '-') ? '\0' : *(argv[idx] + 1);
        if ((chVal != 'y') && (chVal != 'm') && (chVal != 'd'))
            return makeError (argv[idx], "does not start with '-y/m/d'");

        intVal = atoi (argv[idx] + 2);
        if (intVal < 0)
            return makeError (argv[idx], "suffix is negative");
        sprintf (buff, "%d", intVal);
        if (strcmp (buff, argv[idx] + 2) != 0)
            return makeError (argv[idx], "suffix is not numeric");

        switch (chVal) {
            case 'y': nowStr->tm_year = intVal - 1900; break;
            case 'm': nowStr->tm_mon = intVal - 1; break;
            case 'd': nowStr->tm_mday = intVal; break;
        }
    }

    mktime (nowStr);
    strftime (buff, sizeof (buff), "%A, %d %B %Y", nowStr);
    printf ("%s\n", buff);

    return 0;
}

以下是文本示例:

代码语言:javascript
运行
复制
pax> ./dow
Tuesday, 09 October 2012

pax> ./dow -y2011
Sunday, 09 October 2011

pax> ./dow -y2000 -m1 -d1
Saturday, 01 January 2000
票数 3
EN

Stack Overflow用户

发布于 2012-10-09 10:32:30

最可能的解释是,如果您要请求strftime打印星期几,那么它需要tm_wday具有有意义的值。

这是避免自己计算的最简单的方法:

代码语言:javascript
运行
复制
struct tm tm;

memset(&tm, 0, sizeof(struct tm));
tm.tm_mday = Cur_Day;
tm.tm_mon = Cur_Month - 1;
tm.tm_year = entries[i].Year_Start - 1900;
tm.tm_hour = 12;

(void) timegm(&tm); /* fills in the rest of `tm` as a side effect */

/* now call strftime */

不要使用timegm的Linux手册页中描述的“timegm的可移植版本”,它的可移植性陷阱几乎是每一行都要处理的!

票数 1
EN

Stack Overflow用户

发布于 2012-10-09 10:30:09

您需要设置str_time.tm_wday,以便strftime()可以对其进行转换。

有关示例,请参阅localtime(3)strftime(3)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12792044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档