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的值是什么,一周中的某一天都是星期天,上面的结果是什么?
示例输出:
Sunday, 23 November 2012
------------------------
stuff
Sunday, 25 November 2012
------------------------
stuff
Sunday, 26 November 2012
------------------------
stuff发布于 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()之前更改要更改的字段。这样,您就可以保证所有字段都有合理的值。
下面的程序展示了一种实现此目的的方法:
#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;
}该程序的输出为:
Now = Tuesday, 09 October 2012
Tomorrow = Wednesday, 10 October 2012无论如何,这里有一个完整的程序,它使用该方法为您提供给定日期的星期几(默认为今天)。
您可以使用可选的-y、-m和-d参数按任意顺序和次数更改年份、月份和月份的日期,尽管每种类型只有最后一次有效。
#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;
}以下是文本示例:
pax> ./dow
Tuesday, 09 October 2012
pax> ./dow -y2011
Sunday, 09 October 2011
pax> ./dow -y2000 -m1 -d1
Saturday, 01 January 2000发布于 2012-10-09 10:32:30
最可能的解释是,如果您要请求strftime打印星期几,那么它需要tm_wday具有有意义的值。
这是避免自己计算的最简单的方法:
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的可移植版本”,它的可移植性陷阱几乎是每一行都要处理的!
发布于 2012-10-09 10:30:09
您需要设置str_time.tm_wday,以便strftime()可以对其进行转换。
有关示例,请参阅localtime(3)和strftime(3)。
https://stackoverflow.com/questions/12792044
复制相似问题