以下内容源于朱有鹏《物联网大讲堂》课程的学习整理,如有侵权,请告知删除。

一、关于时间的概念

1、GMT时间

  • GMT是格林尼治时间,也就是格林尼治地区的当地时间;
  • 用格林尼治的当地时间作为全球国际时间,用以描述全球性的事件的时间,方便大家记忆。
  • 选这个地区,是因为它是天文学发源地。

2、UTC时间

  • GMT时间是以前使用的,近些年使用UTC时间;
  • 参考http://www.cnblogs.com/qiuyi21/archive/2008/03/04/1089456.html。

3、计算机中与时间有关的部件

  • 点时间和段时间,段时间=点时间-点时间
  • 定时器和实时时钟,定时器(timer)定的时间就是段时间,实时时钟(RTC)是和点时间有关的一个器件。

二、linux系统中的时间

1、jiffies的引入

  • jiffies是linux内核中的一个全局变量,是(以内核的节拍时间为单位时间)一个数值,由此数值可以知道过了多少个节拍;
  • 内核配置时定义了一个节拍时间,linux内核的调度系统工作时,以这个节拍时间为时间片;
  • 开机时,jiffies变量有一个基准值,然后内核每过一个节拍时间jiffies就会加1。

2、linux系统如何记录时间

(1)开机启动时,内核会读取RTC硬件(断电会继续运行,有电池),获取一个时间作为初始基准时间

  • 这个基准时间对应一个jiffies值;
  • 这个基准时间换算成jiffies值的方法:用这个时间减去1970-01-01 00:00:00 +0000(UTC),然后把这个时间段换算成jiffies数值。
  • 这个jiffies值作为我们开机时的基准jiffies值存在;
  • 系统运行时,每个时钟节拍的末尾都会给jiffies这个全局变量加1,因此操作系统就使用jiffies这个全局变量记录当前的时间。
  • 当需要当前时间点时,就用jiffies这个时间点去计算;
  • 计算方法:先把当前的jiffies值对应的时间段算出来,然后加上1970-01-01 00:00:00 +0000(UTC)即可得到这个时间点。

(2)操作系统只在开机时读一次RTC

  • 整个系统运行过程中RTC是无作用的,RTC的真正作用是在OS的2次开机之间进行时间的保存。

(3)理解要点

  • jiffies这个变量记录的是段时间(即当前时间和1970-01-01 00:00:00 +0000(UTC)这个时间的差值);
  • 一个时间节拍的时间取决于操作系统的配置,现代linux系统一般是10ms或者1ms。
  • 这个时间其实就是调度时间,在内核中用HZ来记录和表示。如果HZ定义成1000,则时钟节拍就是1/HZ,也就是1ms。

3、linux中时间相关的系统调用

(1)常用的时间相关的API和C库函数有9个

  • time、ctime、localtime、gmtime、mktime、asctime、strftime、gettimeofday、settimeofday;

(2)time系统调用返回(当前时间距离1970-01-01 00:00:00 +0000(UTC)的)秒数

  • time内部用jiffies换算得到秒数;
  • 其他函数基本都是围绕着time来工作的;

(3)gmtime、localtime把time得到的秒数变成一个struct tm结构体表示的时间

  • gmtime得到的是国际时间,而localtime得到的是本地(运行localtime函数的程序所在的计算机所设置的时区对应的本地时间)时间;
  • mktime用来完成相反方向的转换(struct tm到time_t);

(4)如果想从struct tm出发,得到字符串格式的时间,可以用asctime或者strftime;如果想从time_t出发,得到字符串格式的时间,用ctime。

(5)gettimeofday返回的时间

  • 由struct timeval和struct timezone这两个结构体来共同表示的,其中timeval表示时间,而timezone表示时区;
  • settimeofday是用来设置当前的时间和时区的;

(6)总结

  • 不管使用哪个系统调用,最终得到的时间本质上都是一个时间(这个时间最终都是从kernel中记录的jiffies中计算得来的);
  • 不同的函数返回的时间的格式不同,精度不同。

三、时间相关API实战

1、time

  • time能得到一个当前时间距离标准起点时间1970-01-01 00:00:00 +0000(UTC)过去了多少秒

2、ctime

  • ctime可以从time_t出发得到一个容易观察的字符串格式的当前时间;
  • ctime好处是很简单好用,可以直接得到当前时间的字符串格式,直接打印来看。
  • 坏处是ctime的打印时间格式是固定的,没法按照我们的想法去变。
  • ctime函数得到的时间考虑了计算机中的本地时间的(计算机中的时区设置)。

3、gmtime和localtime

  • gmtime获取的时间中:年份是以1970为基准的差值,月份是0表示1月,小时数是以UTC时间的0时区为标准的小时数。
  • localtime和gmtime的唯一区别就是localtime以当前计算机中设置的时区为小时的时间基准,其余一样。实践证明我们的猜测是正确的。

4、mktime

  • 从OS中读取时间时用不到mktime的,这个mktime是用来向操作系统设置时间时用的。

5、asctime

  • asctime得到一个固定格式的字符串格式的当前时间,效果上和ctime一样的。
  • 区别是ctime从time_t出发,而asctime从struct tm出发。

6、strftime

  • asctime和ctime得到的时间字符串都是固定格式的,没法用户自定义格式;
  • 如果需要用户自定义时间的格式,则需要用strftime。

7、gettimeofday和settimeofday

  • 前面讲到的基于time函数的那个系列都是以秒为单位来获取时间的,没有比秒更精确的时间;
  • 有时候希望得到非常精确的时间(譬如以us为单位),只能通过gettimeofday来实现。

8、代码

#include <stdio.h>
#include <time.h>
#include <string.h>
#include <sys/time.h>int main(void)
{time_t tNow = -1;struct tm tmNow;char buf[100];struct timeval tv = {0};struct timezone tz = {0};int ret = -1;// time//tNow = time(NULL);      // 返回值time(&tNow);              // 指针做输出型参数if (tNow < 0){perror("time");return -1;}printf("time: %ld.\n", tNow);// ctimeprintf("ctime: %s.\n", ctime(&tNow));//ctime可以从time_t出发得到一个容易观察的字符串格式的当前时间;
#if 0   // gmtime 和localtimememset(&tmNow, 0, sizeof(tmNow));gmtime_r(&tNow, &tmNow);printf("年%d月%d日%d时%d.\n", tmNow.tm_year, tmNow.tm_mon, tmNow.tm_mday, tmNow.tm_hour);//可重入版本的,不用在子函数内部申请空间,而是结构体在外部申请空间后,结构体作为传参传入//因此之前必须menset。//对比不可重入的,一般是在子函数内部为结构体申请空间。memset(&tmNow, 0, sizeof(tmNow));localtime_r(&tNow, &tmNow);printf("年%d月%d日%d时%d.\n", tmNow.tm_year, tmNow.tm_mon, tmNow.tm_mday, tmNow.tm_hour);
#endif#if 0// asctimememset(&tmNow, 0, sizeof(tmNow));localtime_r(&tNow, &tmNow);printf("年%d月%d日%d时%d.\n", tmNow.tm_year, tmNow.tm_mon, tmNow.tm_mday, tmNow.tm_hour);printf("asctime:%s.\n", asctime(&tmNow));
#endif#if 0// strftimememset(&tmNow, 0, sizeof(tmNow));localtime_r(&tNow, &tmNow);printf("年%d月%d日%d时%d.\n", tmNow.tm_year, tmNow.tm_mon, tmNow.tm_mday, tmNow.tm_hour);memset(buf, 0, sizeof(buf));strftime(buf, sizeof(buf), "%Y * %m * %d, %H-%M-%S.", &tmNow);printf("时间为:[%s].\n", buf);
#endif// gettimeofdayret = gettimeofday(&tv, &tz);if (ret < 0){perror("gettimeofday");return -1;}printf("seconde: %ld.\n", tv.tv_sec);printf("timezone:%d.\n", tz.tz_minuteswest);return 0;
}

获取系统信息1——linux系统中的时间相关推荐

  1. linux系统中的时间

    1.jiffies的引入 (1)jiffies是Linux中的一个全局变量,这个变量用来记录以内核的节拍时间为单位时间长度的一个数值. (2)内核配置的时候定义了一个节拍时间,实际上linux内核的调 ...

  2. Linux系统中的时间设置(硬件时钟VS系统时钟)

    在实际工作中,我们部署在linux系统中的应用的运行通常需要使用正确的时间,而在没有时钟同步服务的时候,就需要我们手动去修改linux的系统时间.那么这里就说说如何修改linux的系统时间. 软件时钟 ...

  3. 获取系统信息2——linux中使用随机数

    以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 1.随机数和伪随机数 随机数是随机出现,没有任何规律的一组数列. 真正的完全随机的数列是不存在的,只是一种理想情况 ...

  4. php执行who命令,Linux_在Linux系统中使用who和whoami命令获取用户信息,who用法:who [选项]... [ 文件 | - phpStudy...

    在Linux系统中使用who和whoami命令获取用户信息 who用法:who [选项]... [ 文件 | 参数1 参数2 ] 显示当前已登录的用户信息. -a, --all             ...

  5. 编程实现在Linux系统中Intel CPU功耗的获取

    编程实现在Linux系统中Intel CPU功耗的获取 编程实现在Linux系统中Intel CPU功耗的获取 资料的获取 X86 MSR寄存器介绍 X86 CPUID介绍 X86 RAPL介绍 Li ...

  6. 对Linux系统中的时钟和时间的探讨

    2019独角兽企业重金招聘Python工程师标准>>> 概要 1)介绍Linux系统中时钟的基本概念 2)探讨hwclock命令的工作方式. 3)系统启动过程中Linux系统对系统时 ...

  7. php获取当前设备,Linux_在Linux系统中使用lsblk和blkid显示设备信息的方法,今天我们将会向你展示如何使 - phpStudy...

    在Linux系统中使用lsblk和blkid显示设备信息的方法 今天我们将会向你展示如何使用 lsblk 和 blkid 工具来查找关于块设备的信息,我们使用的是一台安装了 CentOS 7.0 的机 ...

  8. Linux系统中获取临时文件路径 `GetTempPath`和`GetTempFileName`函数

    Linux系统中获取临时文件路径 为了在Linux系统中获得WIN API的GetTempPath和GetTempFileName函数的功能,我们要在Linux下实现这两个函数. GetTempPat ...

  9. 10、Linux系统中的日志管理及时间设定

    Linux系统中的日志管理 实验环境 一.journald 1.journalctl命令的用法 2.永久存放日志 二.rsyslog 1.自定义日志采集路径 2.日志的远程同步 3.更改日志采集格式 ...

最新文章

  1. Travelling (三进制+状压dp)
  2. 番茄花园 Ghost XP SP3 金秋国庆版 2013.AA0
  3. linux 内核 发送数据,linux 内核tcp数据发送的实现
  4. 频谱仪使用方法图解_地暖分水器原理及使用方法介绍,图解
  5. mac安装hadoop2-client
  6. I00023 鸡兔同笼解法二
  7. BEST定理:有向图欧拉回路个数(bzoj 3659: Which Dreamed It)
  8. Oracle ADF开发实战指南pdf
  9. k8s1.18-kubeadm安装手册
  10. python大师_GitHub - lltx/Python-100-Days: Python - 100天从新手到大师
  11. HFSS远场辐射设置与辐射方向图设置
  12. 关机计算机cmd,图文详解电脑关机命令是什么
  13. Tensorflow 笔记 Ⅳ——mnist手写数字识别
  14. SpringCloud系列——Eureka中Region和Zone概念介绍
  15. 【论文阅读】Generalization in Reinforcement Learning
  16. 编译原理——自下而上的语法分析方法(LR分析法)
  17. Payment:接入支付宝当面付(扫码支付与条码支付)教程
  18. 【国庆福利】中奖名单公布
  19. 考试系统之选择题评分
  20. 多种方法爬取猫眼电影并分析(附代码)

热门文章

  1. 【SCOI2005】【BZOJ1087】互不侵犯King(状压dp)
  2. 子元素增加margin-top会增加给父元素的问题
  3. view-activity跟控件在onkey事件上的传递关系
  4. Linux(CentOS)挂载NTFS格式的U盘、移动硬盘
  5. MailMail升级到1.0.2.4
  6. 翁同龢后人向上海博物馆捐赠两件重要家藏
  7. 看完Java的动态代理技术——Pythoner笑了
  8. Check Point CEO:“我们正在积极寻找收购目标”
  9. Vue.directive自定义指令
  10. SharePoint Server 2016 PWA(Project web app) 被变为只读模式