Linux时间编程三大步骤

一、Linux时间类型

在Linux系统当中,时间分为两种类型:格林威治时间和日历时间。

Coordinated Universal Time(UTC)是世界标准的时间,即常说的格林威治标准时间(Greenwich Mean Time,GMT);UTC与GMT两者几乎是同一概念,都是指格林威治时间,只不过UTC的称呼更为正式一点。两者的区别是UTC是天文学上的概念,而GMT是基于一个原子钟。

Calendar Time是用“一个标准时间点(如1970年1月1日0点)到此时经过的秒数”来表示的时间,即日历时间;它与格林威治时间不同。

GMT是中央市区,北京在东8区,相差8个小时,所以北京时间=GMT时间+8小时。

++获取系统时间函数有:time()、gettimeofday();++

++设置系统时间函数有:stime()、settimeofday();++

二、Linux时间格式

2.1 time_t 时间类型

time_t类型定义在time.h中:

#ifndef __TIME_T
#define __TIME_T
typedef long time_t
#endif

可见,time_t实际是一个长整型。其值表示为从UTC(coordinated universal time)时间1970年1月1日00时00分00秒(也称为Linux系统的Epoch时间)到当前时刻的秒数。由于time_t类型长度的限制,它所表示的时间不能晚于2038年1月19日03时14分07秒(UTC)。为了能够表示更久远的时间,可用64位或更长的整型数来保存日历时间。

time_t类型的时间可以通过time()函数获取。

2.2 struct tm时间类型

struct tm结构在time.h中定义为:

#include <time.h>
struct tm {
        int tm_sec;         /* seconds */
        int tm_min;         /* minutes */
        int tm_hour;        /* hours */
        int tm_mday;        /* day of the month */
        int tm_mon;         /* month */
        int tm_year;        /* year */
        int tm_wday;        /* day of the week */
        int tm_yday;        /* day in the year */
        int tm_isdst;       /* daylight saving time */
};

ANSI C标准称使用tm结构的这种时间为分解时间(broken-down time)。其成员介绍如下:

  • tm_sec:秒,取值区间为[0,59];
  • tm_min:分,取值区间为[0,59];
  • tm_hour:时,取值区间为[0,23];
  • tm_mday:日期,取值区间为[1,31];
  • tm_mon:月份,取值区间为[0,11];
  • tm_year:年份,其值为1900年至今的年数;
  • tm_wday:星期,取值区间为[0,6],0代表星期天,1代表星期一,以次类推;
  • tm_yday:从年的1月1日开始的天数,取值区间为[0,365],0代表1月1日;
  • tm_isdst:夏令时标识符,使用夏令时,tm_isdst为正;不使用夏令时,tm_isdst为0;不了解情况时,tm_isdst为负。

使用gmtime()和localtime()可将time_t时间类型转换为struct tm结构体;

使用mktime()可将struct tm结构体转换为time_t时间类型;

使用asctime()将struct tm转换为字符串形式。

2.3 struct timeval时间类型

struct timeval结构体在sys/time.h中定义如下:

#include <sys/time.h>
struct timeval {
    time_t      tv_sec;     /* seconds:秒 */
    suseconds_t tv_usec;    /* microseconds:微妙 */
};

tv_sec是time_t时间类型,其值也表示为从UTC(coordinated universal time)时间1970年1月1日00时00分00秒(也称为Linux系统的Epoch时间)到当期时刻的秒数。

设置时间函数settimeofday()与获取时间函数gettimeofday()均使用该事件类型作为参数传递。

2.4 struct timespec时间类型

struct timespec结构体在time.h中定义为:

typedef long time_t;
struct timespec {
    time_t   tv_sec;     /* seconds:秒 */
    long     tv_nsec;    /* microseconds:纳妙 */
};

它是POSIX.4标准定义的时间结构,精确度到纳秒,一般由clock_gettime(clockid_t, struct timespec *)获取特定时钟的时间。常用如下4种时钟:

  • CLOCK_REALTIME 统当前时间,从1970年1.1日算起
  • CLOCK_MONOTONIC 系统的启动时间,不能被设置
  • CLOCK_PROCESS_CPUTIME_ID 本进程运行时间
  • CLOCK_THREAD_CPUTIME_ID 本线程运行时间

三、Linux时间编程接口

接下来介绍的时间编程函数接口均属于Linux系统调用函数。

3.1 time()函数

【函数原型】:

#include <time.h>
time_t time(time_t *tloc);

【函数说明】:

该函数用于获取日历时间,即从1970年1月1日0点到现在所经历的秒数。参数tloc通常设置为NULL,若tloc非空,time()函数也会将返回值存到tloc指针指向的内存中。

【返回值】:

该函数执行成功返回秒数,失败则返回((time_t)-1)值,错误原因存于errno中。

【使用例程】:

#include <stdio.h>
#include <time.h>
    
int main(void)
{
    time_t seconds = 0;
    
    seconds = time((time_t *)NULL);
    printf("seconds = %d\n",seconds);
    
    return 0;
}

执行结果为:

seconds = 1434620150

通常用户得到日历时间的秒数没有实际的意义,但可以为时间转化做一些辅助性质的工作。为了更好的利用时间,用户需要将这些秒数转换为更易接受的时间表示方式ÿ

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值