【问题标题】:What is the difference between clock_t, time_t and struct tm?clock_t、time_t 和 struct tm 有什么区别?
【发布时间】:2012-08-27 17:31:49
【问题描述】:

clock_t、time_t和struct tm有什么区别?

struct tm 看起来像这样:

struct tm{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};

但是 clock_ttime_t 长什么样子呢?

【问题讨论】:

    标签: c time struct time-t time.h


    【解决方案1】:

    time_t 是一个绝对时间,表示为自 UNIX 纪元(格林威治标准时间午夜,1970 年 1 月 1 日)以来的整数秒数。它作为时间点的明确、易于使用的表示非常有用。

    clock_t 是时间的相对度量,表示自某个时间点以来的整数时钟滴答数(可能是计算机的启动,但不能保证,因为它可能会经常翻转)。每秒有CLOCKS_PER_SEC 个时钟滴答;这个常数的值在不同的操作系统之间可能会有所不同,但通常在100左右。有时用于计时目的,但由于分辨率相对较低,因此不太擅长。 gettimeofdaystruct timeval 更适合计时。

    struct tm 是日历日期和时间。它可能不代表任何真实的时间点(例如,您可以有一个 struct tm 表示现在是 2 月 31 日或十二月 0 日)。它不包括时区,因此不是绝对的。它通常用于在日期和时间的人类可读表示之间进行转换。

    【讨论】:

    • “表示为自 UNIX 纪元(格林威治标准时间午夜,1970 年 1 月 1 日)以来的整数秒数。”很常见,但不是由 C 定义的。time_t 可能是 double 并引用 1970 年 1 月 1 日以外的其他纪元。
    • @chux 确实。 C 没有指定 time_t 的纪元或类型值,但 UNIX 会。
    • @Qqwy UNIX 没有充分指定类型范围,所以我们有 2038 problem 以及忽略那些真实的,如果讨厌的话,leap seconds
    【解决方案2】:

    time_t 表示当前时间——通常是自某个时期以来的秒数(例如,1970 年 1 月 1 日午夜)。它旨在表示日历/挂钟时间,但仍然易于作为单一的简单算术类型进行操作(例如,difftime 可以找到两个指定时间之间的差异)。

    clock_t 表示自进程启动以来使用的 CPU 时间量。它可以通过除以 CLOCKS_PER_SEC 转换为秒。它的真正意图是表示使用的 CPU 时间,而不是日历/挂钟时间。

    struct tm 是一个结构(具有指定的成员),它表示分解为组件的日历/挂钟时间 - 年、月、日、小时、分钟、秒等。它旨在(主要)作为外部接口,而time_t 主要用于内部使用——即,典型用途是当您从外部世界获取日期/时间时,您将组件放入struct tm 并将其转换为time_t用于内部存储。然后,当您需要执行诸如显示时间/日期之类的操作时,您可以将time_t 转换为struct tm。执行这种操作的例程包括相当多的智能来执行诸如标准化日期之类的操作,因此像 30 February 这样的日期将被转换为 2 March(或者在闰年,1 March)。

    【讨论】:

      【解决方案3】:

      C 只是这么说:

      (C99, 7.23.1p3) "clock_t 和 time_t 是能够表示时间的算术类型"

      glibc 中,time_t 类型是long 的别名。

      在 GNU C 库中,time_t 等价于 long int

      来自http://www.gnu.org/software/libc/manual/html_node/Simple-Calendar-Time.html

      【讨论】:

      • +1 表示“time_t 是 long 的别名”,这很好知道。
      • 请注意,time_t 在现代版本中是 64 位数字(而在许多平台上,long 仅为 32 位)以防止 Year 2038 Problem
      猜你喜欢
      • 1970-01-01
      • 2011-11-14
      • 2015-05-06
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      • 1970-01-01
      • 2019-05-06
      相关资源
      最近更新 更多