7

我需要以“HH:MM:SS”格式将当前时间转换为字符数组(字符串),以便稍后可以简单地输出结果printf("%s", timeString);

顺便说一句,我对timevalandtime_t类型很困惑,所以任何解释都会很棒:)

编辑:所以我尝试了 strftime 等,它有点工作。这是我的代码:

time_t current_time;
struct tm * time_info;
char timeString[8];

time(&current_time);
time_info = localtime(&current_time);

strftime(timeString, 8, "%H:%M:%S", time_info);
puts(timeString);

但输出是这样的:“13:49:53a??J`aS?”

最后的“ a??J`aS? ”是怎么回事?

4

3 回答 3

13

你从这段代码中得到了垃圾:

time_t current_time;
struct tm * time_info;
char timeString[8];

time(&current_time);
time_info = localtime(&current_time);

strftime(timeString, 8, "%H:%M:%S", time_info);
puts(timeString);

因为您不允许字符串上的空终止符 (\0) 有空间,所以当它打印字符串时,它不知道结尾在哪里,并将下一位内存中的随机垃圾解释为字符串的一部分.

将其更改为:

time_t current_time;
struct tm * time_info;
char timeString[9];  // space for "HH:MM:SS\0"

time(&current_time);
time_info = localtime(&current_time);

strftime(timeString, sizeof(timeString), "%H:%M:%S", time_info);
puts(timeString);

它会正常工作,因为strftime()将有足够的空间来添加 \0。请注意,我使用 sizeof(array) 来避免忘记更改两个地方的数字的风险。

于 2009-10-07T11:56:42.033 回答
5

看一下strftime函数,它允许您以您选择的格式将时间写入 char 数组。

于 2009-10-07T11:41:01.120 回答
3
#include <stdio.h>
#include <time.h>

/* get seconds since the Epoch */
time_t secs = time(0);

/* convert to localtime */
struct tm *local = localtime(&secs);

/* and set the string */
sprintf(timeString, "%02d:%02d:%02d", local->tm_hour, local->tm_min, local->tm_sec);

处理时间的重要类型(时间的挂钟类型,而不是进程/线程时间)是time_tstruct tm
通过一些工作,您可以在一个和另一个之间进行转换,但您必须注意本地时间与 UTC 时间。

仔细阅读 的描述<time.h>,尝试那里的功能,直到您熟悉C语言。

再次,注意 UTC 时间和本地时间。

于 2009-10-07T11:49:37.570 回答