C - time_t 字符串表示

C - time_t string representation

我是 C 编程的新手,我需要一些帮助来完成一个简单的任务。

所以我有这个功能:

char *time2str(time_t time) {
     static_char *str_fmt = "%02d/%02d/%4d %02d:%02d";
     char *time_s = "";

     return time_s;
}

我想做的是 DD/MM/YYYY HH:MM 格式化时间并将其存储在 time_s 变量中,以便我可以 return 它。我的问题是我不知道如何格式化字符串并在不打印它的情况下存储它。到目前为止,我所发现的只是 sprint 方法,它在存储时也实际打印格式化的字符串,这不是我想要的。

简而言之,我只想将 time_t 时间以我提到的格式存储在 time_s 中。

抱歉,如果我没有正确解释所有内容,但我是 C 编程的新手。

您需要 sprintf,它类似于 printf,但 "prints" 将结果放入缓冲区而不是屏幕上。

返回指向静态缓冲区的指针:

char *time2str(time_t time) {
     static_char *str_fmt = "%02d/%02d/%4d %02d:%02d";

     static char time_s[20];                             // ugly, 20 is hopefully enough
  // ^ static is important here, because we return a pointer to time_s
  //   and without static, the time_s buffer will no longer exist once the
  //   time2str function is finished

     sprintf(time_s, str_fmt, time.....);
     return time_s;
}

或者(更好),我们提供一个缓冲区(足够长)来放置转换后的字符串:

void time2str(time_t time, char *time_s) {
     static_char *str_fmt = "%02d/%02d/%4d %02d:%02d";
     sprintf(time_s, str_fmt, time.....);
     return time_s;
}
...
char mytime[20];                                         // ugly, 20 is hopefully enough
time2str(time, mytime);
printf("mytime: %s\n, mytime);

或 time2str 函数 returns 一个新分配的缓冲区,它将包含转换后的字符串。稍后必须使用 free 释放该缓冲区。

char *time2str(time_t time) {
     static_char *str_fmt = "%02d/%02d/%4d %02d:%02d";
     char *time_s = malloc(20);                          // ugly, 20 is hopefully enough
     sprintf(time_s, str_fmt, time.....);
     return time_s;
}
...
char *mytime = time2str(time);
printf("mytime: %s\n, mytime);
free(mytime);

完成 sprintf 的论证留作 reader 的练习。

免责声明:未经测试、无错误检查的代码仅用于演示目的。

time_t 值转换为 struct tm 类型后,您可以使用 strftime()

函数ctime接受一个time_t并以固定格式输出一个字符串。如果这不足以完成您的任务,您应该使用 strftime。这有一大堆格式说明符应该适合您的需要。

它适用于 struct tm,因此您首先必须使用 localtimegmtime 将您的 time_t 转换为

一般来说,

  1. 调用 time() 将当前时间放入 time_t 变量
  2. 调用 localtime() 获取指向 struct tm 结构的指针,时间信息在单独的字段中
  3. 调用 strftime() 以获得所需的 time/date 格式。

建议阅读 localtime()strftime() 的手册页以获取所有详细信息

这里是一个示例代码,您需要在其中修改 strftime() 格式字符串,以便在生成的 char 数组中包含您想要的内容。

time_t     currentTimeSec = time(NULL);
struct tm *tmStructptr;
char       timeStamp[128];

tmStructptr = localtime( &currentTimeSec );
strftime( timeStamp, sizeof(timeStamp), "YOUR FORMAT STRING" tmStructptr );

注意:要仅提取星期几,格式字符串将为:“%w”