专栏首页Android相关Linux编程--获取当前时间

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 条评论
登录 后参与评论

相关文章

  • 解决"No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android"错误

    转载自:https://blog.csdn.net/vocanicy/article/details/83004626

    None_Ling
  • Android-LinearLayout中getChildMeasureSpec解析

    该函数的注释是:执行最难的一步:测量子View大小,测量出指定的MeasureSpec 给一个单独的子View,这个方法要计算出子View正确的HeightMe...

    None_Ling
  • 机器学习介绍

    设计和分析一些让计算机可以自动“学习“的算法。机器学习算法是一类从庞大的数据中自动分析获得规律,并利用规律对未知数据进行预测的算法。

    None_Ling
  • kera 学习-线性回归

    园子里头看到了一些最基础的 keras 入门指导, 用一层网络,可以训练一个简单的线性回归模型。

    用户2434869
  • [Leetcode][贪心法]相关题目汇总/分析/总结

    后端技术漫谈
  • Linux LVM简明教程

    逻辑卷管理LVM是一个多才多艺的硬盘系统工具。无论在Linux或者其他类似的系统,都是非常的好用。传统分区使用固定大小分区,重新调整大小十分麻烦。但是,LVM可...

    江小白
  • 以太猫技术总监亲叙踩坑史: 为什么渐进式去中心化才是区块链的希望?

    一年前,当我们发布CryptoKitties(迷恋猫,也叫以太猫)时,我们并没有选择通过 ICO进行融资,而是建立了一个可持续的收入模式。 这个模式是这样的: ...

    区块链大本营
  • LintCode 207. 区间求和 II(线段树)

    在类的构造函数中给一个整数数组, 实现两个方法 query(start, end) 和 modify(index, value):

    Michael阿明
  • Android 滚轮控件WheelView

    饮水思源为名
  • 想查看微信好友撤回的消息?Python帮你搞定

    本篇文章将用Python实现微信的防撤回功能,针对微信操作,Python有一个十分强大的库:itchat。相信没有使用过也有所耳闻吧。官方是这样描述它的:

    ZackSock

扫码关注云+社区

领取腾讯云代金券