linux系统中的时间API和函数库

GMT时间是以前使用的,近些年来越来越多的使用UTC时间。
关于时间的计算,可以参考: http://www.cnblogs.com/qiuyi21/archive/2008/03/04/1089456.html

linux系统中的时间函数
---jiffies的引入
jiffies是linux内核中的一个全局变量,这个变量用来记录以内核的节拍时间为单位时间长度的一个数值。

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)这个时间的差值)
(4)一个时间节拍的时间取决于操作系统的配置,现代linux系统一般是10ms或者1ms。这个时间其实就是调度时间,在内核中用HZ来记录和表示。如果HZ定义成1000难么时钟节拍就是1/HZ,也就是1ms。

linux中时间相关的系统调用
(1)常用的时间相关的API和C库函数有9个:time/ctime/localtime/gmtime/mktime/asctime/strftime/gettimeofday/settimeofday有9个:time/ctime/localtime/gmtime/mktime/asctime/strftime/gettimeofday/settimeofday
(2)gmtime和localtime会把time得到的秒数变成一个struct tm结构体表示的时间。区别是gmtime得到的是国际时间,而localtime得到的是本地(指的是你运行localtime函数的程序所在的计算机所设置的时区对应的本地时间)时间。mktime用来完成相反方向的转换(struct tm到time_t)
(3)如果从struct tm出发想得到字符串格式的时间,可以用asctime或者strftime都可以。(如果从time_t出发想得到字符串格式的时间用ctime即可)
(4)gettimeofday返回的时间是由struct timeval和struct timezone这两个结构体来共同表示的,其中timeval表示时间,而timezone表示时区。settimeofday是用来设置当前的时间和时区的。
(5)总结:不管用哪个系统调用,最终得到的时间本质上都是一个时间(这个时间最终都是从kernel中记录的jiffies中计算得来的),只不过不同的函数返回的时间的格式不同,精度不同。


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

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

3、gmtime和localtime
(1)gmtime获取的时间中:年份是以1970为基准的差值,月份是0表示1月,小时数是以UTC时间的0时区为标准的小时数(北京是东8区,因此北京时间比这个时间大8)
(2)猜测localtime和gmtime的唯一区别就是localtime以当前计算机中设置的时区为小时的时间基准,其余一样。实践证明我们的猜测是正确的。

  	time_t tNow = -1;
	struct tm tmNow;
	
	// time
	//tNow = time(NULL);		// 返回值
	time(&tNow);				// 指针做输出型参数
	printf("time: %ld.\n", tNow);
	
	// ctime
	printf("ctime: %s.\n", ctime(&tNow));
	
	// gmtime 和localtime
	memset(&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);
	
	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);

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

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

6、strftime
(1)asctime和ctime得到的时间字符串都是固定格式的,没法用户自定义格式
(2)如果需要用户自定义时间的格式,则需要用strftime。

7、gettimeofday和settimeofday
(1)前面讲到的基于time函数的那个系列都是以秒为单位来获取时间的,没有比秒更精确的时间。
(2)有时候我们程序希望得到非常精确的时间(譬如以us为单位),这时候就只能通过gettimeofday来实现了。

	char buf[100];
	struct timeval tv = {0};
	struct timezone tz = {0};
#if 0
	// asctime
	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);
	printf("asctime:%s.\n", asctime(&tmNow));
#endif

#if 0
	// strftime
	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);
	
	memset(buf, 0, sizeof(buf));
	strftime(buf, sizeof(buf), "%Y * %m * %d, %H-%M-%S.", &tmNow);
	printf("时间为:[%s].\n", buf);
#endif

	// gettimeofday
	ret = gettimeofday(&tv, &tz);
	if (ret < 0)
	{
		perror("gettimeofday");
		return -1;
	}
	printf("seconde: %ld.\n", tv.tv_sec);
	printf("timezone:%d.\n", tz.tz_minuteswest);


 
   




  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux API文手册是一个开源的文档工具,涵盖了Linux操作系统的各个方面。它提供了一个完整的参考,涵盖了系统调用、C库函数、网络协议和驱动程序接口。这个手册是由社区驱动的开源项目,所有文档都可以自由访问和编辑。 Linux API文手册的主要优点是它包含了丰富的示例代码和详细的解释,可以帮助新手快速入门Linux编程。这个手册也非常有用,对于有经验的Linux开发人员来说,他们也能够快速地查找必要的信息和函数接口。 该手册覆盖了Linux系统的各种方面,例如进程管理、内存管理、文件系统、网络编程和用户接口等等,而且不断更新维护,与最新的操作系统版本保持同步。这个手册提供了一个完整的参考,涵盖了Linux操作系统下的所有编程接口和相关信息,为开发人员提供了方便。 总之,在Linux开发Linux API文手册是一个极具价值的工具,是Linux开发人员进行开发的必备参考资料。它不仅能够快速提高编程速度和效率,也能够帮助开发人员掌握Linux系统下的各种编程技巧和方法。 ### 回答2: Linux API 文手册是一本非常宝贵的参考工具,它详细地记录了Linux操作系统的所有API函数,供程序员在开发过程使用。这本手册包含了Linux系统调用、C标准库函数、POSIX函数、网络编程接口等众多方面的内容,能够帮助程序员在编写高质量的应用程序时提高效率和准确性。 这本手册非常详细,不仅包含了每个函数的用法、参数、返回值及注意事项等细节,也提供了实用的示例和代码,可以帮助程序员完全理解函数的使用方法,并有效地解决问题和调试程序。同时,手册还提供了一些附加信息,如常见错误码、操作系统错误及其解决方案等,这些都大大简化了程序员在使用和调试函数时的工作量。 总之,Linux API 文手册可以为程序员提供全面、准确的知识,最大限度地提高开发效率和程序质量,同时也是Linux操作系统开发者的宝贵知识库。无论你是一名初学者还是资深开发者,这本手册都值得你参考和学习,深入了解Linux系统的运作原理和技术架构。 ### 回答3: Linux API 文手册是指提供 Linux 命令行及编程 API 相关文档的文翻译手册。Linux API(Application Programming Interface)是指 Linux 操作系统提供给应用程序使用的一组接口和函数库,包括系统调用、网络协议、文件系统、进程管理等等。 对于开发人员而言,熟悉 Linux API 是非常必要的,因为它们可以帮助开发者编写高效、可靠且稳定的应用程序。而 Linux API 文手册则是为那些使用文阅读更为便捷的开发人员提供的参考文档。 Linux API 文手册的内容十分丰富,覆盖了大量的系统调用、函数库等内容,既包括基本的文件、输入输出操作,也包括高级的网络编程、多线程、进程间通信等方面。同时还提供了详细的参数说明、示例代码等,方便开发人员理解和使用。 对于正在学习 Linux 编程的开发人员而言,Linux API 文手册是非常有价值的学习资料,通过使用手册提供的示例代码和实践,开发人员可以更快地掌握 Linux 编程技能,并且能够更快、更准确地完成所需的开发任务。 总之,Linux API 文手册是一本非常重要的参考文献,能够帮助开发者更好地掌握和使用 Linux 编程相关技术,提高程序开发效率和开发质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值