【问题标题】:Best way to get and print formatted datetime?获取和打印格式化日期时间的最佳方法?
【发布时间】:2020-12-26 10:37:10
【问题描述】:

我是偶尔使用 Pascal 的程序员,现在我必须编写一些 C 程序。

我想以我喜欢的格式打印当前时间,在学习了几个 C 教程后,我想出了:

time_t now;
struct tm *t;
char buffer[80];
time( &now );
t = localtime( &now );
strftime(buffer,80,"%Y-%m-%d %H:%M:%S", t);
printf("%s\n", buffer);

Free Pascal 或 Delphi 中只需要一行的 7 行代码:

writeln(datetimetostr(now));  

或者如果您不想使用全局系统设置:

writeln(FormatDateTime('DD MM YYYY',now));  

现在我确定 c-world 拥有像上面这些预先准备好的更高级别的功能。

但是我如何找到它们呢?

以系统或自定义格式打印当前时间的最佳方法是什么?

【问题讨论】:

  • Now I am certain ?为什么? And what is the best way如何衡量“最好”? 7 lines that 从技术上讲,您省略了 timelocaltimestrftime 错误检查。如果你不喜欢 C 有多个语句而其他语言有一个,那么不要使用它。如果您不喜欢换行符,可以删除它们。在我看来,您提出了一种以请求格式打印当前本地时间的“好方法”。

标签: c time printing pascal


【解决方案1】:

现在我确定 c-world 拥有像上面这些预先准备好的更高级别的功能。

不是,不是,至少不是标准库的一部分。在不使用任何第三方库或工具的情况下,这几乎是如何完成的 - 获取 time_t 值(自纪元开始以来的秒数),将其转换为 struct tm(分解为年份,月、日、小时、分钟、秒),将 struct tm 值连同目标缓冲区和格式字符串一起传递给 strftime,将缓冲区的内容写入输出流。

您可以像 alk 所示的那样整合一些步骤,但我不建议这样做 - 这会使代码更难阅读和调试。

时间戳通常用于显示以外的操作,因此将它们设为数字类型可以使比较或算术等操作更加直接。权衡是格式化它们以输出需要额外的步骤。

【讨论】:

    【解决方案2】:

    但是我如何找到它们呢?

    你不会,因为它们不存在,至少不作为 C/POSIX 的一部分。

    不过,可能会有第三方库或多或少地提供您需要的东西。

    如果你想要更少的行和更少的变量,你可以这样做:

    char buffer[80];
    strftime(buffer, sizeof buffer,"%Y-%m-%d %H:%M:%S", localtime(&((time_t){time(NULL)})));
    puts(buffer);
    

    否则就自己动手吧:

    #include <stdio.h>
    #include <time.h>
    
    char * format_date_time(const char * f, time_t t)
    {
      static char buffer[80]; /* This is not thread safe! */
      strftime(buffer, sizeof buffer, f, localtime(&t));
      return buffer;
    }
    
    int main(void)
    {
      puts(format_date_time("%Y-%m-%d %H:%M:%S", time(NULL)));
    }
    

    回答你的第二个问题:

    以系统或自定义格式打印当前时间的最佳方式是什么?

    我觉得你的做法很好。

    【讨论】:

    • 有推荐的第三方库吗?
    猜你喜欢
    • 1970-01-01
    • 2019-10-30
    • 2011-06-05
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    相关资源
    最近更新 更多