C++ 获取系统时间
有的帖子真心写的很好,你都想帮作者打广告。有的烂到即使你从里面学到了知识,你也不想再见到它,你都不想在自己的笔记里放它的链接,不然说不准哪天又点进去浪费自己的时间。
说一下思路:
- 使用开发语言自身的标准库。对于 C++ 来说,使用 C 的或者 C++ 的
- 使用第三方库,如果有的话
- 使用系统相关 API。缺点在于不能跨平台
C 标准库
优点就是仅使用 C 标准库,能够跨平台使用;缺点 是只能精确到秒级。
1 |
|
struct tm
结构体定义:
1 | struct tm { |
帖子很棒!日常时间的获取、格式化等操作汇总
计算时间差值:
double difftime(time_t time1, time_t time0);
利用
mktime()
函数,获取某一天是本周的第几天(tm_wday
),是当年的第几天(tm_yday
)现在注意了,有了
mktime()
函数,是不是我们可以操作现在之前的任何时间呢?你可以通过这种办法算出 1945 年 8 月 15 号是星期几吗?答案是否定的。因为这个时间在 1970 年 1 月 1 日之前,所以在大多数编译器中,这样的程序虽然可以编译通过,但运行时会异常终止。使用限制:
time_t
类型的限制既然
time_t
实际上是长整型,到未来的某一天,从一个时间点(一般是 1970 年 1 月 1 日 0 时 0 分 0 秒)到那时的秒数(即日历时间)超出了长整形所能表示的数的范围怎么办?对time_t
数据类型的值来说,它所表示的时间不能晚于 2038 年 1 月 18 日 19 时 14 分 07 秒。
另外,要强调的是获取时间后推荐 使用本地结构保存。小心 C 语言时间函数陷阱
第三方库
没有接触过
Windows API
优点:能精确到毫秒级;缺点:使用了 windows API
1 |
|
SYSTEMTIME
结构体定义:
1 | typedef struct _SYSTEMTIME { |
更详细的信息,请查阅 MSDN-SYSTEMTIME structure条目
Linux库
区分
<sys/time.h>
和<time.h>
头文件,前者是*inux系统的系统库,后者可能也带有*inux色彩,但侧重 ANSI C 标准。区分 GNU C和 ANSI C。
<time.h>
中不纯粹是 ANSI C 标准的定义,还包括一些 Linux 下的扩展,比如 ANSI(C99) 标准是没有要求微秒、纳秒类型的,而在 Linux 系统中的<time.h>
包含struct timespec
纳秒类型。如果代码中使用了这些扩展类型、扩展函数,就会造成平台移植时的不确定性。
日期与时间函数在
<time.h>
中,主要表示处理器时钟的clock_t
类型、表示时间的time_t
类型、时钟每秒滴答数CLOCKS_PER_SEC
、描述日历时间的struct tm
结构、函数clock、time
、asctime
、ctime
、gmtime
、localtime
、mktime
、difftime
、strftime
、wcsftime(宽字符版本)
,其他的都是非标准扩展。
获取时间间隔
C标准库
前文提到我们可以使用 difftime()
函数,但它只能精确到秒。如更精确一些呢?
参考 详细介绍C/C++时间函数使用方法,推荐☆☆☆☆
C/C++ 中的计时函数是 clock()
,而与其相关的数据类型是 clock_t
。这个函数返回从“开启这个程序进程”到“程序中调用 clock()
函数”时之间的 CPU 时钟计时单元(clock tick)数。在 <time.h>
文件中,还定义了一个常量 CLOCKS_PER_SEC
,它用来表示一秒钟会有多少个时钟计时单元
可以用 clock
函数来计算你的机器运行一个循环或者处理其它事件到底花了多少时间:
1 |
|
扩展阅读
在 SUSE11 系统下,查找 CLOCKS_PER_SEC
的定义,在 time.h 中 指向 <bits/time.h>
,其目录:
1 | cts@SuSe-CTS2:/usr/include/bits> pwd |
然后找到看到以下宏:
1 | # define CLOCKS_PER_SEC 1000000l |
在 Debian8.1 系统下,同上。<bits/time.h>
目录:
1 | niel@debian8light:/usr/include/x86_64-linux-gnu/bits$ pwd |
关于闰秒
闰秒,英文名称 leap second,即 23:59:60
尽管 C 标准没有定义,它几乎总是一个保有从 UTC 1970 年 1 月 1 日 00:00 开始秒数的整数值(不计闰秒),对应 POSIX 时间
Unix time (also known as POSIX time or UNIX Epoch time) is a system for describing a point in time. It is the number of seconds that have elapsed since 00:00:00 Thursday, 1 January 1970, Coordinated Universal Time (UTC), minus(减去) leap seconds. Every day is treated as if it contains exactly 86400 seconds, so leap seconds are to be subtracted(扣除) since the epoch.
1 |
|