Linux下用C获取当前时间

Linux下用C获取当前时间,具体如下:

代码(可以把clock_gettime换成time(NULL))

?


1

2

3

4

5

6

7

8

9

10

void getNowTime()

{

 timespec time;

 clock_gettime(CLOCK_REALTIME, &time); //获取相对于1970到现在的秒数

 tm nowTime;

 localtime_r(&time.tv_sec, &nowtime);

 char current[1024];

 sprintf(current, "%04d%02d%02d%02d:%02d:%02d", nowTime.tm_year + 1900, nowTime.tm_mon, nowTime.tm_mday,

  nowTime.tm_hour, nowTime.tm_min, nowTime.tm_sec);

}

分析:

clock_gettime()

函数"clock_gettime"是基于Linux C语言的时间函数,他可以用于计算精度和纳秒。

语法:

?


1

2

3

#include<time.h>

int clock_gettime(clockid_t clk_id,struct timespec *tp);

参数:

clk_id : 检索和设置的clk_id指定的时钟时间。

CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变,即从UTC1970-1-1 0:0:0开始计时,中间时刻如果系统时间被用户改成其他,则对应的时间相应改变

  •   CLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响
  •   CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统CPU花费的时间
  •   CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统CPU花费的时间

?


1

2

3

4

5

6

7

8

9

struct timespec

{

time_t tv_sec; /* 秒*/

long tv_nsec; /* 纳秒*/

};

localtime()

localtime是 把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为本地时间.

语法

说明:此函数获得的tm结构体的时间是日历时间。

用 法: struct tm *localtime(const time_t *clock);

返回值:返回指向tm 结构体的指针.tm结构体是time.h中定义的用于分别存储时间的各个量(年月日等)的结构体.

例1:

?


1

2

3

4

5

6

7

8

9

10

11

12

#include <stdio.h>

#include <stddef.h>

#include <time.h>

int main(void)

{

 time_t timer;//time_t就是long int 类型

 struct tm *tblock;

 timer = time(NULL);

 tblock = localtime(&timer);

 printf("Local time is: %s\n", asctime(tblock));

 return 0;

}

执行结果:

Local time is: Mon Feb 16 11:29:26 2009

例2:

上面的例子用了asctime函数,下面这个例子不使用这个函数一样能获取系统当前时间。需要注意的是年份加上1900,月份加上1。

?


1

2

3

4

5

6

7

8

9

10

11

#include<time.h>

#include<stdio.h>

int main()

{

 struct tm *t;

 time_t tt;

 time(&tt);

 t = localtime(&tt);

 printf("%4d年%02d月%02d日 %02d:%02d:%02d\n", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);

 return 0;

}

localtime()与localtime_r()的区别

localtime():

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

#include <cstdlib>

#include <iostream>

#include <time.h>

#include <stdio.h>

 

using namespace std;

 

int main(int argc, char *argv[])

{

 time_t tNow =time(NULL);

 time_t tEnd = tNow + 1800;

 //注意下面两行的区别

 struct tm* ptm = localtime(&tNow);

 struct tm* ptmEnd = localtime(&tEnd);

 

 char szTmp[50] = {0};

 strftime(szTmp,50,"%H:%M:%S",ptm);

 char szEnd[50] = {0};

 strftime(szEnd,50,"%H:%M:%S",ptmEnd);

  

 

 printf("%s /n",szTmp);

 printf("%s /n",szEnd);

  

 

 system("PAUSE");

 return EXIT_SUCCESS;

}

最后出来的结果是:

21:18:39

21:18:39

和最初想法不一致。

查阅localtime的文档,发现这段话:

This structure is statically allocated and shared by the functions
gmtime and localtime. Each time either one of these functions is called
the content of this structure is overwritten.

也就是说每次只能同时使用localtime()函数一次,要不就会被重写!

The localtime() function need not be reentrant. A function that is
not required to be reentrant is not required to be thread-safe.

因此localtime()不是可重入的。同时libc里提供了一个可重入版的函数localtime_r();

Unlike localtime(), the reentrant version is not required to set tzname。

修改程序:(localtime_r())

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

#include <cstdlib>

#include <iostream>

#include <time.h>

#include <stdio.h>

 

using namespace std;

 

int main(int argc, char *argv[])

{

 time_t tNow =time(NULL);

 time_t tEnd = tNow + 1800;

 

 //在这里修改程序

 //struct tm* ptm = localtime(&tNow);

 //struct tm* ptmEnd = localtime(&tEnd);

 struct tm ptm = { 0 };

 struct tm ptmEnd = { 0 };

 localtime_r(&tNow, &ptm);

 localtime_r(&tEnd, &ptmEnd);

  

 char szTmp[50] = {0};

 strftime(szTmp,50,"%H:%M:%S",&ptm);

 char szEnd[50] = {0};

 strftime(szEnd,50,"%H:%M:%S",&ptmEnd);

 printf("%s /n",szTmp);

 printf("%s /n",szEnd);

  

 

 system("PAUSE");

 return EXIT_SUCCESS;

}

最后出来的结果是:

10:29:06

10:59:06

tm

?


1

2

3

4

5

6

7

8

9

10

11

struct tm {

    int tm_sec;  /* 秒 – 取值区间为[0,59] */

    int tm_min;  /* 分 - 取值区间为[0,59] */

    int tm_hour;  /* 时 - 取值区间为[0,23] */

    int tm_mday;  /* 一个月中的日期 - 取值区间为[1,31] */

    int tm_mon;  /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */

    int tm_year;  /* 年份,其值等于实际年份减去1900 */

    int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一 */

    int tm_yday; /* 从每年1月1日开始的天数– 取值区间[0,365],其中0代表1月1日 */

    int tm_isdst; /* 夏令时标识符,夏令时tm_isdst为正;不实行夏令时tm_isdst为0 */

  };

time 函数

返回:1970-1-1, 00:00:00以来经过的秒数

原型: time_t time(time_t *calptr)

结果可以通过返回值,也可以通过参数得到,见实例

头文件 <time.h>

返回值:

成功:秒数,从1970-1-1,00:00:00 可以当成整型输出或用于其它函数

失败:-1

例:

?


1

2

3

time_t now;

time(&now);// 等同于now = time(NULL)

printf("now time is %d\n", now);

时间: 2024-10-06 10:37:37

Linux下用C获取当前时间的相关文章

Linux下文件的三个时间意义及用法

Linux下文件的三个时间参数: (1)modification time(mtime):内容修改时间        这里的修改时间指的是文件的内容发生变化,而更新的时间. (2)change time(ctime):状态修改时间        这里的修改时间指的是文件的属性或者权限发生变化,而更新的时间. (3)access time(atime):最后访问时间        这里的访问时间是指文件被读取,而更新的时间. 在Linux下操作命令分别为: ls -l    获取文件最后一次内容修

windows和linux下如何远程获取操作系统版本和主机名

远程获取windows和linux操作系统版本和主机名需要具备以下条件: 假设 主机A(windows 7),ip:192.168.12.2 主机B(centos 6.3),ip:192.168.12.3 主机C(windows 2008)-为远程要获取信息的主机,ip:192.168.12.4 主机D(centos 6.3)-为远程要获取信息的主机,ip:192.168.12.5 windows: 1.主机A可以ping通主机C: 2.主机B可以ping通主机C: 3.主机B可以通过161端口

win/linux 下使用 psutil 获取进程 CPU / memory / IO 占用信息

psutil - A cross-platform process and system utilities module for Python 1. 安装 pip 安装即可. windows 下需要安装 vs2008,否则报错: Unable to find vcvarsall.bat 如果已经安装 vs2010 / vs2012 则需要设置环境变量,VS90COMNTOOLS 指向已有的 vs 变量. vs2010 设置如下: VS90COMNTOOLS = %VS100COMNTOOLS%

(转)LINUX下Live555不能获取ip地址解决方法

linux下运行live55 显 示如图 :没有获取ip:  ip是0.0.0.0 live555在不知道本地IP地址与网络接口的情况下,通过一个在本地某端口建立一个UDP连接,然后把这个UDP连接加入 到一个组播组 ,当然要对这个组播组进行相应的设置,比如TTL,回环等等:然后通过UDP连接发送一个数据:最后通过这个UDP连接接收这个数据,并且解析相应的发送地址:大概流程就是这样了. 具体的代码片段live555:groupsock/GroupsockHelper.cpp里:因此我们设置固定的

有关Linux下request.getRealPath(&quot;/&quot;)获取路径的问题

request.getRealPath("/") 在window获取的是服务器的根目录,结尾包含分隔符, 如E:\apache-tomcat-6.0.29-bak\apache-tomcat-6.0.29\apache-tomcat-6.0.29\webapps\test\ 在Linux下获取的不含分隔符,如: /home/weblogic/Desktop/PTYT/ptytNetpay/WebRoot 因此需要判断处理: String root = request.getRealPa

linux 下查看文件的完整时间信息及三种时间属性

一.linux下查看文件的完整时间信息 1.Linux 下查看文件时,ls –l 缺省是不显示秒的: # ls -l /etc/ total 0 -rw-r--r--.  1 root   root         16 Jan  5 09:43 adjtime -rw-r--r--.  1 root   root       1518 Jun  7  2013 aliases 2.要显示秒(实际更精确),可以用 –full-time 参数: # ls -l /etc/ --full-time

Linux下文件的三种时间标记:访问时间、修改时间、状态改动时间 (转载)

在windows下,一个文件有:创建时间.修改时间.访问时间. 而在Linux下,一个文件也有三种时间,分别是:访问时间.修改时间.状态改动时间. 两者有此不同,在Linux下没有创建时间的概念,也就是不能知道文件的建立时间,但如果文件建立后就没有修改过,修改时间=建立时间;如果文件建立后, 状态就没有改动过,那么状态改动时间=建立时间;如果文件建立后,没有被读取过,那么访问时间=建立时间,因为不好判断文件是否被改过.读过.其状态是否 变过,所以判断文件的建立时间基本上能为不可能. 如何查一个文

Linux下文件的三个时间:ctime、mtime、atime的区别

Linux下,文件的三个时间参数 (1)modification time(mtime):内容修改时间 这里的修改时间指的是文件的内容发生变化,而更新的时间. Eg:vi后保存文件. (2)status time(ctime):状态修改时间 这里的修改时间指的是文件的属性或者权限发生变化,而更新的时间. Eg:通过chmod.chown命令修改一次文件属性,这个时间就会更新. (3)access time(atime):最后访问时间 这里的访问时间是指文件被读取,而更新的时间. Eg:对这个文件

方法:Linux 下用JAVA获取CPU、内存、磁盘的系统资源信息

CPU使用率: InputStream is = null; InputStreamReader isr = null; BufferedReader brStat = null; StringTokenizer tokenStat = null; // 用来分隔String的应用类 try { System.out.println("Get usage rate of CUP : "); Process process = Runtime.getRuntime().exec(&quo