【问题标题】:C - time_t string representationC - time_t 字符串表示
【发布时间】:2017-04-09 23:06:55
【问题描述】:

我是 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 变量中,以便我可以返回它。我的问题是我无法弄清楚如何格式化字符串并在不打印的情况下存储它。到目前为止,我发现的只是 sprint 方法,它在存储格式化字符串时也实际打印它,这不是我想要的。

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

对不起,如果我没有正确解释所有内容,但我是 C 编程新手。

【问题讨论】:

    标签: c time-t


    【解决方案1】:

    函数ctime 接受time_t 并以固定格式输出字符串。如果这对您的任务来说还不够,您应该使用strftime。这有一大堆格式说明符可以满足您的需要。

    它适用于struct tm,因此您首先必须使用localtimegmtimetime_t 转换为。

    【讨论】:

      【解决方案2】:

      您需要sprintf,它类似于printf,但将结果“打印”到缓冲区而不是屏幕上。

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

      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 函数返回一个新分配的缓冲区,该缓冲区将包含转换后的字符串。稍后必须使用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 的参数留给读者作为练习。

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

      【讨论】:

      • 一般来说,总是至少使用snprintf。使用普通的sprintf! 很容易创建缓冲区溢出
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        一般来说,

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

        建议阅读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”

        【讨论】:

          猜你喜欢
          • 2017-07-19
          • 1970-01-01
          • 1970-01-01
          • 2021-12-26
          • 2016-09-15
          • 2016-12-11
          • 2010-09-24
          • 2010-09-11
          • 2012-11-30
          相关资源
          最近更新 更多