Linux时间操作(time、gettimeofday)

2023-11-07

自:http://blog.chinaunix.net/space.php?uid=24148050&do=blog&id=320294

 

一、time函数   

  1. #include <time.h>
  2. time_t time(time_t *calptr);
返回距计算机元年的秒数
一旦取得这种以秒计的很大的时间值后,通常要调用另一个时间函数将其变换为人们可读的时间和日期

#include <time.h>    
//calendar time into a broken-down time expressed as UTC
struct tm *gmtime(const time_t *calptr);

//converts the calendar time to the local time, taking into account the local time zone and
//daylight saving time flag
struct tm *localtime(const time_t *calptr);

//converts it into a time_t value
time_t mktime(struct tm *tmptr);

  struct tm {        /* a broken-down time */
     int  tm_sec;     /* seconds after the minute: [0 - 60] */
     int  tm_min;     /* minutes after the hour: [0 - 59] */
     int  tm_hour;    /* hours after midnight: [0 - 23] */
     int  tm_mday;    /* day of the month: [1 - 31] */
     int  tm_mon;     /* months since January: [0 - 11] */
     int  tm_year;    /* years since 1900 */
     int  tm_wday;    /* days since Sunday: [0 - 6] */
     int  tm_yday;    /* days since January 1: [0 - 365] */
     int  tm_isdst;   /* daylight saving time flag: <0, 0, >0 */
   };  
  1. char *asctime(const struct tm *tmptr);
  2. char *ctime(const time_t *calptr);

  3. asctime()和ctime()函数产生形式的26字节字符串,这与date命令的系统默认输出形式类似:
        Tue Feb 10 18:27:38 2004/n/0

二、gettimeofday函数得到更精确的时间

  1. #include <sys/time.h>
  2. int gettimeofday(struct timeval *restrict tp, void *restrict tzp);
  3. 第二个形参是基于平台实现的,使用的时候最好用NULL
struct timeval{
    time_t tv_sec;        /*** second ***/
    susecond_t tv_usec;    /*** microsecond 微妙***/
}

1秒=1000毫秒,
1毫秒=1000微秒,
1微妙=1000纳秒,
1纳秒=1000皮秒。
秒用s表现,毫秒用ms,微秒用μs表示,纳秒用ns表示,皮秒用ps表示。

三、内核时间 

内核有两个重要的全局变量:
unsigned long jiffies;
timeval xtime ;


jiffies 是记录着从电脑开机到现在总共的"时钟中断"的次数。
文件linux-2.6.24/kernel/timer.c  
void do_timer(unsigned long ticks)
{
    jiffies_64 += ticks;
    update_times(ticks);
}


xtime 是从cmos电路或rtc芯片中取得的时间,一般是从某一历史时刻开始到现在的时间。
这个就是所谓的"墙上时钟walltimer",通过它可计算得出操作系统需要的日期时间,它的精确度是微秒。

xtime第一次赋值是在系统启动时调用timekeeping_init或time_init进行的
再调用read_persistent_clock进一步调用get_rtc_time得到的

PS:在/proc/uptime里面的两个数字分别表示:   
the uptime of the system(seconds),
and the amount of time spent in idle process(seconds).   

四、代码示例

“UTC时间字符串”与 “time函数返回值”互换
  1. int64_t TimeToUTC(char *time)
  2. {
  3.     struct tm temp1;
  4.     int rc;
  5.     int year;
  6.     int mon;
  7.     int day;
  8.     int hour;
  9.     int min;
  10.     int sec;
  11.     rc = sscanf(time, "%4d-%2d-%2d %2d:%2d:%2d",
  12.                     &(temp1.tm_year),
  13.                     &(temp1.tm_mon),
  14.                     &(temp1.tm_mday),
  15.                     &(temp1.tm_hour),
  16.                     &(temp1.tm_min),
  17.                     &(temp1.tm_sec));
  18.     sscanf(time, "%4d-%2d-%2d %2d:%2d:%2d",
  19.                     &year,
  20.                     &mon,
  21.                     &day,
  22.                     &hour,
  23.                     &min,
  24.                     &sec);
  25.     if((rc<6)
  26.         || (temp1.tm_year<1900) || (temp1.tm_year>2100)
  27.         || (temp1.tm_mon<1) || (temp1.tm_mon>12)
  28.         || (temp1.tm_mday<1) || (temp1.tm_mday>31)
  29.         || (temp1.tm_hour<0) || (temp1.tm_hour>23)
  30.         || (temp1.tm_min<0) || (temp1.tm_min>59)
  31.         || (temp1.tm_sec<0) || (temp1.tm_sec>59))
  32.     {
  33.         return -1;
  34.     }
  35.     temp1.tm_mon -= 1;
  36.     temp1.tm_year -= 1900;
  37.     struct tm temp3;
  38.     time_t temp2 = mktime(&temp1);
  39.     if (temp2 == -1){
  40.         return -1;
  41.     }
  42.     else{
  43.         localtime_r(&temp2, &temp3);
  44.         if (!((mon == (temp3.tm_mon+1))
  45.             && (day == temp3.tm_mday)
  46.             &&(year == (temp3.tm_year+1900)))){
  47.             return -1;
  48.         }
  49.         else{
  50.                 return temp2*1000000LL;
  51.         }
  52.     }
  53. }
  54. void UTCToTime(int64_t utc, char * clock)
  55. {
  56.     struct tm temp1;
  57.     time_t sec;
  58.     float msec;
  59.     int rc;
  60.     sec = utc/1000000;
  61.     msec = utc/1000000.0-sec;
  62.     localtime_r(&sec, &temp1);
  63.     temp1.tm_year += 1900;
  64.     temp1.tm_mon += 1;
  65.     rc = sprintf(clock, "%04d-%02d-%02d %02d:%02d:%02d",
  66.                     temp1.tm_year,
  67.                     temp1.tm_mon,
  68.                     temp1.tm_mday,
  69.                     temp1.tm_hour,
  70.                     temp1.tm_min,
  71.                     temp1.tm_sec);
  72.     clock[rc] = '/0';
  73. }

生成Date
  1. static char * g_weekstr[7] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
  2. static char * g_monthstr[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  3.                 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
  4. /*generate the current date string*/
  5. time_t now = time(NULL);
  6. struct tm tt;
  7. gmtime_r( &now, &tt );
  8. char timebuf[64];
  9. snprintf( timebuf, sizeof(timebuf),
  10.         "%s, %02d %s %d %02d:%02d:%02d GMT",
  11.         g_weekstr[tt.tm_wday], tt.tm_mday,
  12.         g_monthstr[tt.tm_mon], tt.tm_year + 1900,
  13.         tt.tm_hour, tt.tm_min, tt.tm_sec );

------------------------------ 华丽的分割线 ------------------------------------

关于scanf的返回值
Both scanf and wscanf return the number of fields successfully converted
and assigned; the return value does not include fields that were read but
not assigned. A return value of 0 indicates that no fields were assigned.
The return value is EOF for an error or if the end-of-file character or the
end-of-string character is nocountered in the first attempt to read a character.

如:scanf("%d%d", &a, &b);
如果a和b都被成功读入,那么scanf的返回值就是2
如果只有a被成功读入,返回值为1
如果a和b都未被成功读入,返回值为0
如果遇到错误或遇到end of file,返回值为EOF。
  1. void main()
  2. {
  3.     int a;
  4.     int b;
  5.     int c;
  6.     int x;
  7.     printf("请输入三个整数:");
  8.     x=scanf("%d%d%d",&a,&b,&c);
  9.     printf("%d/n%d/n",a,x);
  10. }
  11. 输入三个整数:5 6 7则x的值为3;
  12. 输入5 6 d(即给c 赋值不正确)则x的值为2;
  13. 输入5 t d(即给b和c 赋值不正确)则x的值为1;

scanf()的返回值对我们来说也很有用的,例如可使用if(scanf("%d,%d",&a,&b)==2)这样语句来判断是否正确的给所有的变量赋值了,正确的话才能使用这个变量与运算,这样才能提高我们代码的安全性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux时间操作(time、gettimeofday) 的相关文章

  • C 位域内存使用情况

    我需要处理以下形式的一些数据 typedef struct unsigned n1 12 unsigned n2 12 unsigned n3 12 unsigned n4 1 unsigned n5 35 data 我确保它们总共最多有
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 在 Linux 上以编程方式设置 DNS 名称服务器

    我希望能够通过我的 C C 程序为 Linux 上的 DNS 名称服务器添加 IP 地址 我在一个带有只读 etc resolv conf 的嵌入式平台上 这意味着我不能简单地将 nameserver xxx xxx xxx xxx 行添加
  • 如何在linux中以编程方式获取dir的大小?

    我想通过 C 程序获取 linux 中特定目录的确切大小 我尝试使用 statfs path struct statfs 但它没有给出确切的大小 我也尝试过 stat 但它返回任何目录的大小为 4096 请建议我如何获取 dir 的确切大小
  • 从 ttyUSB0 写入和读取,无法得到响应

    我对 Linux tty 不太有经验 我的环境是带有丰富 USB 串行的 Raspbian 什么有效 stty F dev ttyUSB0 38400 cu l dev ttyUSB0 s 38400 cu to dev ttyUSB0作品
  • 线性空白到底是什么? (LWS/LWSP)

    我看到提到了这个术语 还有 CRLF CR LF CTL 控制字符 和 SP 空格 如果它不是常规的内联空格 那么它是什么字符 From STD68 语法规范的增强 BNF ABNF http www rfc editor org std
  • 使用 shell 脚本将行附加到 /etc/hosts 文件

    我有一个新的 Ubuntu 12 04 VPS 我正在尝试编写一个安装脚本来完成整个 LAMP 安装 我遇到问题的地方是在 etc hosts文件 我当前的主机文件如下所示 127 0 0 1 localhost Venus The fol
  • 在 Mono 上运行 .Net MVC5 应用程序

    我正在 Windows 上的 Visual Studio 2013 中开发 Net 4 5 1 MVC5 应用程序 现在我想知道 是否可以在Linux Ubuntu 12 04 上运行这个应用程序 可以使用OWIN吗 Owin 可以自托管运
  • 与 pthread 的进程间互斥

    我想使用一个互斥体 它将用于同步对两个不同进程共享的内存中驻留的某些变量的访问 我怎样才能做到这一点 执行该操作的代码示例将非常感激 以下示例演示了 Pthread 进程间互斥体的创建 使用和销毁 将示例推广到多个进程作为读者的练习 inc
  • 配置tomat的server.xml文件并自动生成mod_jk.conf

    我在用apache 2 2 15 and tomcat6 6 0 24 on CentOS 6 4并希望使用 tomcat 服务器的功能 通过添加以下内容自动生成 mod jk conf 文件
  • Intel 上的 gcc 中的 _mm_pause 用法

    我参考过这个网页 https software intel com en us articles benefitting power and performance sleep loops https software intel com
  • 如何查找哪个 Yocto 项目配方填充图像根文件系统上的特定文件

    我经常与 Yocto 项目合作 一个常见的挑战是确定文件为何 或来自什么配方 包含在 rootfs 中 这有望从构建系统的环境 日志和元数据中得出 理想情况下 一组命令将允许将文件链接回源 即配方 我通常的策略是对元数据执行搜索 例如gre
  • 绕过 dev/urandom|random 进行测试

    我想编写一个功能测试用例 用已知的随机数值来测试程序 我已经在单元测试期间用模拟对其进行了测试 但我也希望用于功能测试 当然不是全部 最简单的方法是什么 dev urandom仅覆盖一个进程 有没有办法做类似的事情chroot对于单个文件并
  • 如何使用Android获取Linux内核的版本?

    如何在 Android 应用程序中获取 Linux 内核的版本 不是 100 确定 但我认为调用 uname r 需要 root 访问权限 无论如何 有一种不太肮脏的方法可以做到这一点 那就是 System getProperty os v
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • 这种文件锁定方法可以接受吗?

    我们有 10 个 Linux 机器 每周必须运行 100 个不同的任务 这些计算机主要在我们晚上在家时执行这些任务 我的一位同事正在开发一个项目 通过使用 Python 自动启动任务来优化运行时间 他的程序将读取任务列表 抓取一个打开的任务
  • 结构中的内存布局差异

    我在 C 中有以下结构 struct A int a double b float c 该结构与添加了函数的结构之间的内存布局是否存在差异 struct B int a double b float c void foo B foo do
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的

随机推荐

  • 解读电感和电容在交流电路中的作用

    解读电感和电容在交流电路中的作用 山东 司友毓 一 电感 1 电感对交变电流的阻碍作用 交变电流通过电感线圈时 由于电流时刻都在变化 因此在线圈中就会产生自感电动势 而自感电动势总是阻碍原电流的变化 故电感线圈对交变电流会起阻碍作用 前面我
  • 跨站脚本攻击 XSS原理

    个人对XSS攻击的笔记 原理 对可以控制传参的位置 比如url链接中 输入框中 首先闭合输出参数位置前后网页标签 在闭合的中间加上JavaScript代码或者其他的html标签 使得网页能够执行你添加的参数功能 危害 凡是js能做的 大部分
  • 【友盟+】专访:手游寒冬当下 数据运营如何让产品”活”起来

    11月17日 19日 GMGC2016第五届全球游戏开发者大会在成都东郊记忆举办 今年大会的核心版块之一 名为 生存 前两年涌出过千手游团队的成都手游圈如今继续萎缩 中小团队大量解散 人才匮乏 留下来的公司普遍也缺乏拿得出手的成功产品 拥有
  • R语言入门纪

    前几天在图书馆看书 打算找了统计类的书本补充统计学和数据分析的知识 无意中看到了这本书 菜鸟侦探跳帧数据分析 我一向喜欢看基础和应用类的入门书籍 一打开就爱不释手地看了一般 并借回家继续阅读 这是一本日本教授撰写的R语言统计应用小说 情节贴
  • 数组定义及使用

    文章目录 一 数组基本用法 1 数组的定义 2 数组的使用 二 数组作为方法的参数 1 基本用法 2 理解引用类型 3 数组作为方法的返回值 4 数组拷贝 三 二维数组 一 数组基本用法 在编写代码的过程中 有的时候会发现当需要的变量少的时
  • kubernetes域名

    验证一下重新删除并建立pod和svc pod ip和svc ip会变 1 新建rc文件 root master cat nginx test yml apiVersion v1 kind ReplicationController meta
  • js数据类型--object

    系列文章 1 从数据类型讲原型原型链 内容回顾 在JavaScript中 数据类型可以分为原始类型以及引用类型 其中原始类型包括string number boolean null undefined symbol ES6新增 表示独一无二
  • 什么是“理解”?如何在人工智能中定义“理解”?(what is understanding ?)

    这篇文章主要不是解释哲学上的 理解 而是在计算或者人工智能或是数学上定义 理解 对于人而言 理解似乎是一件简单的事情 在我们上课的时候我们能确切的知道是否理解老师所讲的内容 在我们看书的时候我们能确切的知道书中的内容我们是否理解 在我们与人
  • javascript使用方括号([])引用对象的属性和方法

    在JavaScript中 每个对象可以看作是多个属性 方法 的集合 引用一个属性 方法 很简单 即 对象名 属性 方法 名除此之外 还可以用方括号的形式来引用 对象名 属性 方法 名 注意 这里的方法名和属性名是一个字符串 而非原先点号后面
  • oday-------------powered by discuz! 7.2

    利用google搜索关键字 intxt powered by discuz 7 2 找到一个论坛 注册一个账号注册好后 使用exp http 此处为论坛地址 misc php action imme binding response res
  • 一种简单快速有效的低照度图像增强方法

    一种简单快速有效的低照度图像增强方法 一 本文介绍的是一种比较实用并且去阴影效果很好的方法 选自2004年Tao的一篇论文 名称是 An Integrated Neighborhood Dependent Approach for Nonl
  • 采编系统服务器架构,遂宁日报新闻采编系统的设计与实现

    摘要 新闻稿件采编系统是现今报社现代化办公的必备工具 它对于提高新闻报社工作效率和网络接轨有着重要的意义 随着现代社会中网络化 数字化的不断进步 单凭传统的系统加上纯手工的劳动已经越来越难以满足日报社新闻采编管理工作的需求 1 新闻稿件采编
  • python中csv、json文件的写入和读取

    txt文本文件读取 txt文本文件读取 def txt writter 写文件 函数说明文档 with open data txt w encoding utf 8 as f f write hi n 写一行 lines hello n w
  • Python 爬虫入门的教程(1小时快速入门、简单易懂、快速上手)

    这是一篇详细介绍 Python爬虫入门的教程 从实战出发 适合初学者 读者只需在阅读过程紧跟文章思路 理清相应的实现代码 30 分钟即可学会编写简单的 Python 爬虫 这篇 Python 爬虫教程主要讲解以下 5 部分内容 了解网页 使
  • Velodyne VLP16 激光雷达使用(遇到问题要学会看文档)

    VLP 16激光雷达是Velodyne公司出品的最小型的3维激光雷达 保留了电机转速可调节的功能 实时上传周围距离和反射率的测量值 VLP 16具有100米的远量程测量距离 精巧的外观设计使得安装非常方便 重量轻 只有830g 非常适合安装
  • ChatGPT帮助一名儿童确诊病因,之前17位医生无法确诊

    9月13日 Today消息 一位名叫Alex的4岁儿童得了一种浑身疼痛的怪病 每天需要服用Motrin 美林 才能止痛 3年的时间 看了17名医生无法确诊病因 新闻地址 https www today com health mom chat
  • C++ vector容器

    1 vector基本概念 vector 的数据结构和数组非常相似 也称为单端数组 不同之处在于数组是静态空间 而 vector 可以动态扩展 动态扩展 不是在原空间之后续接新空间 而是找更大的内存空间 然后将原数据拷贝新空间 释放原空间 使
  • 四位数码管3641AS的FPGA实现

    一 数码管介绍 四位数码管3641AS为一款共阴极的四位八段数码管 其具体的每一段为单个二极管 可通过压降实现点亮 通过控制单位多段二极管的点亮实现数字或字母等字符 共阴极 八段发光二极管的阴极端连接在一起 阳极端分开控制 使用时候公共端接
  • 这几款能制作思维导图的软件分享给你

    思维导图工具的优势在于它可以大大提高思考效率 使用思维导图工具 可以更好地组织和理解复杂的信息 并从中提取出重要的要素 此外 思维导图也可以帮助人们更好地记忆信息 接下来这篇文章 我将会介绍几款好用的思维导图软件 一起来看看吧 软件一 简道
  • Linux时间操作(time、gettimeofday)

    自 http blog chinaunix net space php uid 24148050 do blog id 320294 一 time函数 include