Unix时间相关函数总结

在进行Unix编程的过程中,我们不可避免的会遇到需要时间相关的操作,如文件的创建修改时间,数据库中字段插入或更新的时间。

Unix时间相关的类型

  • time_t
  • struct timeb
  • struct timeval
  • struct timespec
  • struct tm
  • clock_t

time_t

time_t是一个有符号的整数类型,表示的含义是从1970年1月1日到某一个时间点的秒数。若为32位系统,由int类型的范围可以推算出,time_t可以表示的时间范围是1901-12-13 20:45:52到2038-01-19 03:14:07。

struct ime_b

time_b结构体是一个精确到毫秒的结构体,其有四个成员,成员列表如下:

1
2
3
4
5
6
struct timeb{
time_t time;
unsigned short millitm;
short timezone;    //时区标志
short dstflag;     //夏令时标志
};

可以通过下列函数获取当前的timeb:

1
int ftime(struct timeb* tb);

struct timeval

timeval是一个精确到微妙的结构体。其中主要包含两个成员:

1
2
3
4
struct timeval{
time_t tv_sec;
suseconds tv_usec;
};

此值通常通过gettimeofday获取

1
2
#include <sys/time.h>
int gettimeofday(struct timeval* tv, struct timezone* tz); //timezone参数已废弃,一般设为NULL,

struct timespec

timespec是一个精确到纳秒的结构体。其主要包含两个成员

1
2
3
4
struct timespec{
time_t tv_sec; //秒
long tv_nsec; //纳秒
}

此结构体一般通过下列函数获取:

1
2
#include <sys/time.h>
long clock_gettime(clockid_t which_clock, struct timespec* tp);

上述参数中which_clock用于标识那种时钟时间,可选值如下

  • CLOCK_REALTIME       : 系统当前时间,1970-1-1开始
  • CLOCK_MONOTONIC      : 系统的启动时间,不能被设置
  • CLOCK_PROCESS_CPUTIME_ID : 进程运行时间
  • CLOCK_THREAD_CPUITME_ID : 线程运行时间
  • CLOCK_REALTIME_HR : CLOCK_REALTIME的高精度版本
  • CLOCK_MONOTONIC_HR : CLOCK_MONOTONIC的高精度版本

struct tm

struct tm被称为一种分解时间,日期和时间被分解成多个独立字段。其形式如下:

1
2
3
4
5
6
7
8
9
10
11
struct tm {
int tm_sec; //秒 (0-60)
int tm_min; //分 (0-59)
int tm_hour; //时 (0-23)
int tm_mday; //日 (1-31)
int tm_mon; //月 (0-11)
int tm_year; //年 (1900-)
int tm_wday; //一周中的周几(周日为0)
int tm_yday; //一年中的第几天。(1月1号为0)
int m_isdst; //DST大于0表示为夏令时时间。
}

Unix时间相关函数

Unix时间相关的函数除了上面已经提到的函数还包括以下函数

  • time(time_t timep)
  • ctime
  • gmtime
  • localtime
  • mktime
  • asctime
  • strftime
  • strptime

time

函数原型

1
2
#include <time.h>
time_t time(time_t* timep);

time函数返回当前时间的时间戳,此时间戳为从1970年1月1日到当前时间的时间戳,此值不受时区和夏令时(DST)。此函数的返回值为当前的时间戳,函数参数为time_t指针,当前时间除了返回值之外,还将此时间放入timep中。所以使用time函数时我们将timep设置为NULL即可。

ctime

函数原型

1
2
#include <time.h>
char* ctime(const time_t* timep);

函数功能

ctime函数的功能为将time_t转化为打印字符串格式。把一个指向time_t的指针timep传入函数ctime,将返回一个长度为26字节的字符串,包含\0和换行符。ctime进行转换的时候,会考虑时区和夏令时,所以返回的时间字符串为当地时间。返回时间的格式如下:

1
Wed Jun 8 14:22:34 2011

特别注意返回的字符串是经由静态分配的,若多次调用此函数,之前获取的时间会受影响。SuSv3规定,调用ctime(),gmtime(),localtime()以及asctime()中的任意一个函数,都可能覆盖其他函数返回的结果。

静态分配的意思是这些函数返回的数据都是般存在同一个静态变量中,所以下一次的结果会覆盖上一次的数据。如果需要对之前的数据保存,此时需要将结果拷贝到自己分配的内存中。

### gmtime和localtime

函数原型

1
2
3
#include <time.h>
struct tm* gmtime(time_t* timep);
struct tm* localtime(time* timep);

函数功能

gmttime和localtime的作用是将time_t值转换为分解时间struct tm类型。他们的主要区别是gmtime转换为对应于UTC的分解时间,而localtime考虑时区和夏令时

mktime

函数原型

1
2
#include <time.h>
time_t mktime(struct tm* timeptr);

#### 函数功能
mktime的作用是将一个本地时区的分解时间转化为time_t类型。需要注意的是,mktime可能改变timeptr所指的内容。若分解时间不符合要求,mktime将其自动转换为有效时间。如秒为61,此时会将其变成1并讲分加1。

asctime

函数原型

1
2
3
#incude <time.h>
char* asctime(const struct tm* timeptr);

函数功能

asc的功能是将分解时间转化为打印时间,特别注意的是asctime转化的过程中不考虑时区和夏令时,返回的数据也是静态分配的。

strftime

函数原型

1
2
#include <time.h>
size_t strftime(char* outstr, size_t maxsize, const char* format, const struct tm* timeptr);

函数功能

此函数的功能是将分解时间转换为打印时间,并可以指定打印时间的格式为format。不同于ctime和asctime,strftime结果不包含换行符。若返回的字符串超过了maxsize大小,函数返回0指示为转换错误。定义的格式中其格式化字符串可以参考预定义的格式。参考《Linux/Unix系统编程手册.上册》第158页。