在本教程中,我们将展示如何在 C 中使用日期和时间。在本教程中,我们使用 C99。
我们从几个定义开始。日历时间,也称为绝对时间,是时间连续体中的一个点,例如 2016 年 2 月 17 日 13:02:5 CET。时间间隔是两个日历时间之间时间连续体的连续部分,例如 2000 年 2 月 20 日 13:00 到 14:00 之间的小时。经过的时间是间隔的长度,例如 28 分钟。
时间量是经过的时间之和。经过的时间不需要是连续的。当工作花了我们十一个小时,我们可能是在不同的日子工作。CPU 时间是中央处理单元 (CPU) 用于处理计算机程序或操作系统指令的时间量。它以系统时钟或秒为单位进行测量。Unix 纪元是指从1970 年 1 月 1 日 00:00:00 UTC 开始的时间(或 1970-01-01T00:00:00Z ISO 8601)。
Unix 时间是自Unix 纪元以来经过的时间的秒数。 Unix
时间的类型为time_t
。另外有一个时间结构体来表示人类可读的日历时间。它由一组包括年、月、日、时、分、秒等变量组成。时间结构体的类型为struct tm
。
现实时间(Wall time、real-world time、wall-clock time)不同于通过计算机微处理器时钟脉冲或周期测量得到的时间。
time.h
包含了以下函数:
char *asctime(const struct tm *)
--- 将时间转化为字符串(过时的)clock_t clock(void)
--- 返回当前进程启动后使用的CPU时间int clock_getres(clockid_t, struct timespec *)
--- 返回时钟精度int clock_gettime(clockid_t, struct timespec *)
---
用于计算时间,有秒和纳秒两种精度;比clock精确int clock_settime(clockid_t, const struct timespec *)
---
设置系统时间char *ctime(const time_t *)
---
将时间值转换为日期和时间字符串(过时)double difftime(time_t, time_t)
--- 计算两个时间的差struct tm *getdate(const char *)
--- 将时间字符串转换为时间结构体struct tm *gmtime(const time_t *)
---
将Unix时间转换为时间结构体(UTC时间)struct tm *localtime(const time_t *)
---
将Unix时间转换为时间结构体(本地时间)time_t mktime(struct tm *)
--- 将时间结构体转换为Unix时间size_t strftime(char *, size_t, const char *, const struct tm *)
---
以指定格式输出时间字符串char *strptime(const char *, const char *, struct tm *)
---
以指定格式的时间字符串配置时间结构体time_t time(time_t *)
--- 返回Unix时间或设置Unix时间void tzset(void)
--- 设置时区信息此外,time.h
文件定义了CLOCKS_PER_SEC
宏,它保存了每秒的处理器时钟刻度数。
clock_t
是进程运行时间类型。
Unix时间是指自Unix纪元以来的秒数。 time()函数返回自1970年1月1日协调世界时0小时0分0秒以来的时间值,单位为秒。 如果发生错误,它返回-1。
如果t!=NULL
,此函数返回值也会存储到t
指向的内存。
时间结构体是一个人类友好的日期时间。结构体类型为struct tm
。函数localtime()
可以将
Unix时间(time_t)
转换为时间结构体。他使用本地账户的时区。函数原型如下:
函数存储了一个结构体并返回指针。
下面关于结构tm的描述来自FreeBSD手册。