linux时间相关c语言函数和使用例子整理

一些基本概念

开始时间

linux时间从1970年1月1日开始计数,记录从1970年1月1日开始到现在的秒数。

什么是UTC

UTC是世界标准时间。UTC是目前主要的世界时间标准,广泛应用在航空、天气预报、同步计算机时钟等各领域。需要注意的是中国内地的时间与UTC的时为+8,也就是UTC+8。美国为UTC-5

struct tm 结构中的成员

struct tm
{
  int tm_sec;      //分后的秒(0~61)
  int tm_min;      //小时后的分(0~59)
  int tm_hour;     //小时(0~23)
  int tm_mday;     //一个月天数(0~31)
  int tm_mon;      //一个后的月数(0~11)
  int tm_year;     //1900年后的年数 Year - 1900.  
  int tm_wday;     //星期日开始的天数(0~6)
  int tm_yday;     //从1月1日开始的时间(0~365)
  int tm_isdst;    //夏令时标志(大于0:夏令时有效,等于0:无效,小于0:信息不可用)
};

带有结构struct tm中的时间函数

time_t mktime(struct tm* tmptr);//把tmptr指向的结构中的分解时间转换成日历时间
char *asctime(const struct tm *tmpt)//把tmpt指向的结构中的分解时间转换成 Thu Feb 26 13:14:13 1998\n\0格式的字符串
struct tm *gmtime(const time_t *ptm);//把ptm指向的日历时间转换成协调世界时(UTC)表示的分解时间,返回一个指向结构的指针,该结构中储时间信息
struct tm *locatime(const time_t *ptm);//把ptm指向的日历时间转换成本地时间表示的分解时间

time_t

time_t类型通常是一个大整数值,该整数值表示自UTC时间1970年1月1日00:00以来经过的秒数即UNIX时间戳,可直接调用time函数获取

time

函数原型

time_t time(time_t *timer);

参数

timer:指向 time_t 类型的变量,用来存放时间值。参数 timer 的值可以为 NULL,time() 函数仍然会将当前的系统时间作为返回值

返回值

返回当前的系统时间(秒数);如果执行失败,函数返回 -1
若参数 timer 不为 NULL,则函数的返回值和参数 timer 所指变量中存储的时间值是相同的

作用

获取当前的系统时间,通常是自 1970 年 1 月 1 日(UTC)以来的秒数

代码示例

#include <stdio.h>
#include <time.h>

int main () 
{
    int ret;
    time_t rawtime;

    ret = time(&rawtime);

    printf("rawtime = %ld\n", rawtime);
    printf("ret     = %d\n", ret);

    return(0);
}

执行结果

在这里插入图片描述

gettimeofday

函数原型

int gettimeofday(struct  timeval*tv,struct  timezone *tz );

作用

tv.tv_sec的值和time函数返回的值是一样的,区别是gettimeofday更精确一些
可以精确到微秒,在测试程序代码执行时间上用的比较多
gettimeofday()函数的头文件为 #include <sys/time.h> 写成#include <time.h>报错
gettimeofday()我们一般写成gettimeofday(&tv,NULL);因为我们不想知道2参的情况
clock_gettime()函数,与gettimeofday类似,但精确度到更高,可以精确到纳秒

代码示例

#include <stdio.h>
#include <sys/time.h>

int main () 
{
    int ret;
    time_t rawtime;
    struct  timeval    tv;
    struct  timezone   tz;

    time(&rawtime);
    printf("rawtime = %ld\n", rawtime);

    gettimeofday(&tv,&tz);
    printf("tv_sec  = %d\n",tv.tv_sec);
    printf("tv_usec = %d\n",tv.tv_usec);

    printf("tz_minuteswest = %d\n",tz.tz_minuteswest);
    printf("tz_dsttime     = %d\n",tz.tz_dsttime);

    return(0);
}

执行结果

在这里插入图片描述

gmtime

函数原型

struct tm * gmtime (const time_t * timer);

接收一个time_t的const指针类型,返回类型为tm的结构体指针

作用

由此可见此函数主要做的就是将大整数值rawtime转换成易读取的时间,如可快速获取年、月、日等
gmtime将time_t转换为UTC时间

代码示例

#include <stdio.h>
#include <time.h> // time_t 、struct tm
 
#define BST (+1)
#define CCT (+8)
 
int main(int argc, char const *argv[])
{
 
   time_t rawtime;
   struct tm *info;
 
   time(&rawtime);
   // 获取 GMT 时间
   info = gmtime(&rawtime);
   
   printf("UTC: %2d:%02d\n", (info->tm_hour)%24, info->tm_min);
   printf("伦敦:%2d:%02d\n", (info->tm_hour+BST)%24, info->tm_min);
   printf("中国:%2d:%02d\n", (info->tm_hour+CCT)%24, info->tm_min);
 
   return(0);
}

执行结果

在这里插入图片描述

localtime

函数原型

struct tm *locatime(const time_t *timer);

接收一个time_t的const指针类型,返回类型为tm的结构体指针

作用

此函数功能和gmtime一致,只是localtime将time_t转换为本地时间(local time)

代码示例

#include <stdio.h>
#include <time.h> // time_t 、struct tm
 
int main(int argc, char const *argv[])
{
   time_t rawtime;
   struct tm *info;
 
   time(&rawtime);
   
   info = localtime(&rawtime);
   
   printf("LOCAL: %d-%d-%d %2d:%02d:%02d\n", info->tm_year+1900, info->tm_mon+1, info->tm_mday, info->tm_hour, info->tm_min, info->tm_sec);
 
   return(0);
}

执行结果

在这里插入图片描述

mktime

函数原型

time_t mktime(struct tm *timeptr)

作用

把 timeptr 所指向的结构转换为自 1970 年 1 月 1 日以来持续时间的秒数
与gmtime相反

代码示例

#include <stdio.h>
#include <time.h>

int main () 
{
    int ret;
    time_t rawtime;
    struct tm* info;

    time(&rawtime);
    printf("rawtime = %ld\n",rawtime);

    info = gmtime(&rawtime);
    printf("UTC: %d-%d-%d %2d:%02d:%02d\n", info->tm_year+1900, info->tm_mon+1, info->tm_mday, info->tm_hour, info->tm_min);
    ret = mktime(info);
    if( ret > 0 )
    {
        printf("ret = %d\n",ret);
    }

    info = localtime(&rawtime);
    printf("LOCAL: %d-%d-%d %2d:%02d:%02d\n", info->tm_year+1900, info->tm_mon+1, info->tm_mday, info->tm_hour, info->tm_min, info->tm_sec);
    ret = mktime(info);
    if( ret > 0 )
    {
        printf("ret = %d\n",ret);
    }

    return(0);
}

执行结果

在这里插入图片描述

问题

它和local是相反的,不应该和UTC时间相反?

asctime

函数原型

char* asctime(struct tm * ptr);

参数

结构指针ptr应通过函数localtime()或gmtime()得到

返回值

返回的时间字符串格式为:星期,月,日,小时:分:秒,年

作用

将结构struct tm * ptr所表示的时间以字符串表示

代码示例

#include <stdio.h>
#include <time.h>

int main () 
{
    int ret;
    time_t rawtime;
    struct tm* info;
    char *str = NULL;

    time(&rawtime);
    info = localtime(&rawtime);
    
    str = asctime(info);
    printf("%s\n",str);
    return(0);
}

执行结果

在这里插入图片描述

ctime

函数原型

char *ctime(const time_t *timeval);

作用

ctime以原始时间值为参数,并将其转换为一个更易读的本地时间

代码示例

#include <stdio.h>
#include <time.h>

int main () 
{
    int ret;
    time_t rawtime;
    struct tm* info;
    char *str = NULL;

    time(&rawtime);
    str = ctime(&rawtime);
    printf("%s\n",str);
    return(0);
}

执行结果

在这里插入图片描述

strftime

函数原型

size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)

作用

根据 format 中定义的格式化规则,格式化结构 timeptr 表示的时间,并把它存储在 str

参数

说明符替换为实例
%a缩写的星期几名称Sun
%A完整的星期几名称Sunday
%b缩写的月份名称Mar
%B完整的月份名称March
%c日期和时间表示法Sun Aug 19 02:56:02 2012
%d一月中的第几天(01-31)19
%H24 小时格式的小时(00-23)14
%I12 小时格式的小时(01-12)05
%j一年中的第几天(001-366)231
%m十进制数表示的月份(01-12)08
%M分(00-59)55
%pAM 或 PM 名称PM
%S秒(00-61)02
%U一年中的第几周,以第一个星期日作为第一周的第一天(00-53)33
%w十进制数表示的星期几,星期日表示为 0(0-6)4
%W一年中的第几周,以第一个星期一作为第一周的第一天(00-53)34
%x日期表示法08/19/12
%X时间表示法02:50:06
%y年份,最后两个数字(00-99)01
%Y年份2012
%Z时区的名称或缩写CDT
%%一个 % 符号%

代码示例

#include <stdio.h>
#include <time.h>

int main () 
{
    int ret;
    time_t rawtime;
    struct tm* info;
    char buffer[80];

    time(&rawtime);

    info = localtime(&rawtime);

    strftime(buffer,sizeof(buffer),"Now is %Y/%m/%d %H:%M:%S",info);
    printf("%s\n", buffer);

    strftime(buffer,sizeof(buffer),"%c %A %j %Z",info);
    printf("%s\n", buffer);

    return(0);
}

执行结果

在这里插入图片描述

difftime

函数原型

double difftime(time_t time1,time_t time2);

作用

返回time1和time2之间相差的秒数(time1-time2)

参数

time1,这是表示结束时间的time_t对象
time2,这是表示开始时间的time_t对象

返回值

该函数返回值以双精度浮点型double值表示的两个时间之间相差的秒数(time2-time1)

代码示例

#include <stdio.h>
#include <time.h>

int main()
{
    time_t start_t,end_t;
    double diff_t;
    printf("start\n");
    time(&start_t);
    printf("sleep 5s\n");
    sleep(5);
    time(&end_t);
    diff_t=difftime(end_t,start_t);
    printf("run time = %f\n",diff_t);
    return (0);
}

执行结果

在这里插入图片描述

参考链接

CSDN-linux系统函数之mktime
菜鸟教程-mktime
菜鸟教程-strftime
CSDN-c语言中获取当前时间的函数
C 语言中的 time 函数总结
CSDN-Linux —— 时间问题(GMT,UTC,DST,CST,CET表示什么、UTC与CST之间的转换)
其他参考的博客未列出
时间戳转换工具

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值