Linux下用C获取当前时间

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

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

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语言的时间函数,他可以用于计算精度和纳秒。

语法:

#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花费的时间
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:

#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。

#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():

#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())

#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

 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

例:

 time_t now;
 time(&now);// 等同于now = time(NULL)
 printf("now time is %d\n", now);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • linux获取系统启动时间示例详解

    1.前言 时间对操作系统来说非常重要,从内核级到应用层,时间的表达方式及精度各部相同.linux内核里面用一个名为jiffes的常量来计算时间戳.应用层有time.getdaytime等函数.今天需要在应用程序获取系统的启动时间,百度了一下,通过sysinfo中的uptime可以计算出系统的启动时间. 2.sysinfo结构 sysinfo结构保持了系统启动后的信息,主要包括启动到现在的时间,可用内存空间.共享内存空间.进程的数目等.man sysinfo得到结果如下所示: 复制代码 代码如下:

  • 程序中获取linux系统启动时间方法

    1.前言 时间对操作系统来说非常重要,从内核级到应用层,时间的表达方式及精度各部相同.linux内核里面用一个名为jiffes的常量来计算时间戳.应用层有time.getdaytime等函数.今天需要在应用程序获取系统的启动时间,通过sysinfo中的uptime可以计算出系统的启动时间. 2.sysinfo结构 sysinfo结构保持了系统启动后的信息,主要包括启动到现在的时间,可用内存空间.共享内存空间.进程的数目等.man sysinfo得到结果如下所示: 复制代码 代码如下: struc

  • Linux下用C获取当前时间

    Linux下用C获取当前时间,具体如下: 代码(可以把clock_gettime换成time(NULL)) void getNowTime() { timespec time; clock_gettime(CLOCK_REALTIME, &time); //获取相对于1970到现在的秒数 tm nowTime; localtime_r(&time.tv_sec, &nowtime); char current[1024]; sprintf(current, "%04d%0

  • Linux下date命令,格式化输出,时间设置方法

    date命令的帮助信息 [root@localhost source]# date --help 用法:date [选项]... [+格式] 或:date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] 以给定的格式显示当前时间,或是设置系统日期. -d,--date=字符串 显示指定字符串所描述的时间,而非当前时间 -f,--file=日期文件 类似--date,从日期文件中按行读入时间描述 -r, --reference=文件 显示文件指定文件的

  • 在linux下玩转带有超时时间的connect函数

    在之前的文章中,我们在Windows下玩过带有超时时间的,本文我们在linux下来玩.在某次面试中,还被遇到了这个问题,有意思. 直接上客户端代码: #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string

  • Linux下通过python获取本机ip方法示例

    下面介绍在Linux上利用python获取本机ip的方法. 经过网上调查, 发现大致有两种方法, 一种是调用shell脚本,另一种是利用python中的socket等模块来得到,下面是这两种方法的源码: #!/usr/bin/env python #encoding: utf-8 #description: get local ip address import os import socket, fcntl, struct def get_ip(): #注意外围使用双引号而非单引号,并且假设默

  • linux下使用perl获取本机ip的几种方法介绍

    在使用 Gearman 做分布式处理时,各机需要注册一个独立的 job 作为信息反馈,为求方便,Gearman::Worker 脚本 register_function 代码又要通用,于是想到了使用各自的 ip 地址作为 job 命名. 那么怎么在 worker 脚本里获取本机 ip 作为 func 呢? 第一种办法,最简单的,调用 shell: 复制代码 代码如下: $ip = `ifconfig eth0|grep -oE '([0-9]{1,3}\.?){4}'|head -n 1`; 注

  • linux下获取文件的创建时间与实战教程

    背景 有时候我们需要获取文件的创建时间. 例如: 我在研究 <xtrabackup 原理图>的时候,想通过观察确认 xtrabackup_log 是最早创建 并且是 最晚保存的文件.我们就需要知道 xtrabackup_logfile 这个文件的创建时间戳和修改时间戳. 复习: Linux关于文件的三个时间戳 Linux 的文件系统保存有三个时间戳,利用 stat 指令查看文件信息可以获取.他们分别是 ATime.MTime 和 CTime [root@192-168-199-198 back

  • Linux下查看binlog文件创建时间的命令

    背景 MySQL在26日 16:23:49产生了大量的慢查询,在这段时间内,binlog文件刷新的很快(查看慢日志是mysql DML并发比较多),想知道写完一个binlog文件究竟花了几分钟时间? 分析 •三个binlog文件的最后修改间隔时间分别是2 分钟和1 分钟 •同一个事务只能写同一个binlog文件 •mysql-bin.016126文件的最后修改时间16:22不一定是mysql-bin.016127 文件创建的时间(存在大事务的情况下,大事务还在写上一个binlog文件,新的事务已

  • Linux下通过gettimeofday函数获取程序段执行时间【推荐】

    在Linux下计算某个程序段执行的时间一般使用gettimeofday函数,此函数的声明在sys/time.h文件中.此函数接收两个结构体参数,分别为timeval.timezone. 两个结构体的声明如下: struct timeval { time_t tv_sec; /* seconds */ long tv_usec; /* microseconds */ }; struct timezone { int tz_minuteswest; int tz_dsttime; }; 一般通过ge

  • python获取Linux下文件版本信息、公司名和产品名的方法

    本文实例讲述了python获取Linux下文件版本信息.公司名和产品名的方法,分享给大家供大家参考.具体如下: 区别于前文所述.本例是在linux下得到文件版本信息,主要是通过pefile模块解析文件 中的字符串得到的.代码如下: def _get_company_and_product(self, file_path): """ Read all properties of the given file return them as a dictionary. @retur

  • linux下通过命令行获取gmail的新邮件

    linux下通过命令行获取gmail的新邮件,不需输入@gmail.com部分 #!/bin/bash num="\033[1;36m" end="\033[0m" read -p "Enter your mail: " name read -p "Enter pass of mail: " pass atom=`wget -qO - https://$name:$pass@mail.google.com/mail/feed/

随机推荐