Linux编程--获取当前时间

背景

最近在重新编译ijkplayer,并且希望能够打印出来各个阶段的时间,以便对于ijkplayer进一步调优

获取时间

Linux获取时间有多种方案,都需要添加#include <time.h>

  1. time调用 通过time函数获得当前时间,注意单位为秒,其中time_t结构体是一个有符号的长整型。 而ctime是一个返回格式化好的字符串的指针。格式为Thu Nov 24 18:22:48 1986\n\0
#include <time.h>
int main()
{
  time_t timep;
  time (&timep);
  printf(“%s”,ctime(&timep));
  return 0;
}
  1. gettimeofday调用 通过gettimeofday调用返回来的是一个timeval的结构体,其中tv_sec是秒数,tv_usec是微秒数,通过这两个数共同标志当前时间
#ifndef _STRUCT_TIMEVAL
#define _STRUCT_TIMEVAL        struct timeval
_STRUCT_TIMEVAL
{
    __darwin_time_t         tv_sec;         /* seconds */
    __darwin_suseconds_t    tv_usec;        /* and microseconds */
};
#endif /* _STRUCT_TIMEVAL */

该函数的使用如下

#include <sys/time.h>

int main(void)
{
  struct timeval time;
  gettimeofday(&time, NULL);
  printf("Current Time Seconds: %ld,uSeconds:%ld\n", time.tv_sec,time.tv_usec);
  return 0;
}

注意

因为在手机上测试的时候,通过gettimeofday获取时间,并且通过网上t.tv_sec*1000+t.tv_usec/1000来计算毫秒数,结果得到的时间错误。而原因就是32位的系统上,long占四个字节,超出2^32则会溢出,导致结果错误。

比如,当前通过gettimeofday获取到的t.tv_sec为1534132538,而t.tv_sec*1000的结果为8292133328。

原因是: 1534132538的二进制为: 1011011011100010000000100111010 1534132538000的二进制为: 10110010100110001011011001100101010010000 而在32位的机器上,long最多占用32,所以得到的32位二进制如下: 00110001011011001100101010010000 转成10进制就是: 829213328 所以,64位的CPU可以进行该运算,32位的会因为溢出导致值不对

最终的解决方案是,通过long long类型的数据结构来保存,long long 占8个字节,也就是最大值为2^64:

long long gettime(){
     struct timeval tv;
     gettimeofday(&tv,NULL);
     long long seconds=tv.tv_sec; // 先将tv.tv_sec保存成long long类型
     return seconds*1000+tv.tv_usec/1000;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏眯眯眼猫头鹰的小树杈

猫头鹰的深夜翻译:理解java的classloader

Java ClassLoader是java运行系统中一个至关重要但是经常被忽略的组件。它负责在运行时寻找并加载类文件。创建自定义的ClassLoader可以彻底...

14640
来自专栏林德熙的博客

C#判断文件是否被混淆

可以使用混淆工具对一个DLL 和 exe 进行混淆。 但是如何知道一个文件是否已经混淆了。 在发布之前,需要知道是不是有文件忘了混淆。

27120
来自专栏木宛城主

Unity应用架构设计(7)——IoC工厂理念先行

一谈到 『IoC』,有经验的程序员马上会联想到控制反转,将创建对象的责任反转给工厂。IoC是依赖注入 『DI』 的核心,大名鼎鼎的Spring框架就是一个非常...

29570
来自专栏玩转JavaEE

MongoDB数据类型

上篇文章我们介绍了MongoDB的最基本的增删改查操作,也介绍了一些基础的概念,MongoDB中每条记录称作一个文档,这个文档和我们平时用的JSON有点像,但也...

34950
来自专栏技巅

Thrift之TProcess类体系原理及源码详细解析

30320
来自专栏黑泽君的专栏

c语言几个松散的地方(不足的地方,不严谨的地方,它容易出错的地方)。

c语言是面向过程的语言,是弱类型语言,c语言的源代码基本就是无数个函数的堆砌。 即很多函数就组成c语言源代码了,也即它的源代码基本就是函数构成的。

21020
来自专栏Petrichor的专栏

python3 调用heapq库 时遭遇 "TypeError: unorderable types"

同样的代码在LeetCode上提交,在 python3解释器 下报错,换成 python2解释器 下却好好的:

16530
来自专栏枕边书

搭建自己的PHP框架心得(二)

续言 对于本次更新,我想说: 本框架由本人挑时间完善,而我还不是PHP大神级的人物,所以框架漏洞难免,求大神们指出。 本框架的知识点应用都会写在博客里,大家有什...

26780
来自专栏加米谷大数据

Python 3.7.0 正式版新特性解析

美国时间6月27日晚8点,Python 3.7.0 经过多轮测试,终于发布了正式版,增强了多处特性功能,同时 3.6 也更新到 3.6.6 稳定版本。

18410
来自专栏张善友的专栏

通用的序列号生成器库

正如文章《通用的业务编号规则设计实现(附源码)》 文章里需要一个多实例和线程安全的序列化生成器,在SQL Server 2012+ 版本 有一个通过.NET程序...

21050

扫码关注云+社区

领取腾讯云代金券