您的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