linux 时间函数总结

来源:互联网 发布:mac系统word下载地址 编辑:程序博客网 时间:2024/06/05 14:39

首先了解关于时间的一些概念:

UTC:协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT,本地时间是基于其的差值

本地时间:本地时间是utc时间和本地时区的差值

日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来 说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间”,但是无论你在哪一个时区, 在同一时刻对同一个标准时间点来说,日历时间都是一样的。日历时间对于utc和本地时间是一样的。


系统时间:是由主芯片的定时器进行维护的时间,一般情况下都会选择芯片上最高精度的定时器作为系统时间的定时基准,以避免在系统运行较长时间后出现大的时间偏移。特点是掉电后不保存。

RTC时间:是指系统中包含的RTC芯片内部所维护的时间。RTC芯片都有电池+系统电源的双重供电机制,在系统正常工作时由系统供电,在系统掉电后由电池进行供电。因此系统电源掉电后RTC时间仍然能够正常运行。

我们下面所设置的时间都是系统时间

 

下面看下时区设置:


#incude <time.h>

void tzset(void);

在time.h中声明了几个全局变量,tzset函数则是设置这些变量

全局变量    说明                                                     缺省值
daylight      如果在TZ设置中指定夏令时时区          1则为非0值;否则为0
timezone    UTC和本地时间之间的时差,单位为秒   28800(28800秒等于8小时)
tzname[0] TZ环境变量的时区名称的字符串值        如果TZ未设置则为空 PST


tzset在程序中用来初始化tzname等全局变量,它首先试图从环境变量“TZ”中获取时区,如果TZ环境变量存在,即getenv("TZ")返回值不为NULL,且包含内容有效,则使用TZ值;如果该变量存在但内容无效,比如包含错误的时区名字,则使用UTC;如果该变量不存在,即getenv("TZ")返回NULL,则查找系统时区设置文件,一般是/etc/localtime。localtime所指文件的内容格式可参考tzfile(5)。




下面介绍获取时间的一些相关函数和数据结构:

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日,1代表1月2日,以此类推 */ 
int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/ 
};   

用time_t表示的时间(日历时间)是从一个时间点(例如:1970年1月1日0时0分0秒)到此时的秒数。在time.h中,我们也可以看到time_t是一个长整型数: 

#ifndef _TIME_T_DEFINED 
typedef long time_t; /* 时间值 */ 
#define _TIME_T_DEFINED /* 避免重复定义 time_t */ 
#endif  

在time.h头文件中,我们还可以看到一些函数,它们都是以time_t为参数类型或返回值类型的函数: 

http://blog.csdn.net/water_cow/article/details/7521567 该博客中有各函数和数据类型详细介绍

double difftime(time_t time1, time_t time0); 
time_t mktime(struct tm * timeptr); 
time_t time(time_t * timer);  //获取日历时间
char * asctime(const struct tm * timeptr);  //将tm转换为可打印的日期字符串
char * ctime(const time_t *timer); 

此外,time.h还提供了两种不同的函数将日历时间(一个用time_t表示的整数)转换为我们平时看到的把年月日时分秒分开显示的时间格式tm: 

struct tm * gmtime(const time_t *timer);  //获取utc时间,直接转换
struct tm * localtime(const time_t * timer); //获取本地时间,通过timezone全局变量做转换 

ctime()/localtime()/mktime():这类和时区相关的函数内部会调用tzset,但只是第一次调用tzset会做实际初始化,后面的调用都是直接返回。

mktime()参数是localtime

int main(int argc, char** argv)
  7 {
  8     time_t t;
  9     struct tm* lt;
 10     t=time(NULL);
 11     printf("time() = %ld\n", t);
 12     lt = localtime(&t);
 13     t = mktime(lt);
 14     printf("time()->localtime()->mktime():%ld\n", t);
 15     return 0;
 16 }
~          

执行上面函数可以看出来





下面介绍设置时间函数

settimeofday( )函数


头文件:#include <time.h>
     
函数定义:int settimeofday(const struct timeval *tv, const struct timezone *gz);
功能描述:settimeofday( )把当前时间设成由tv指向的结构体数据。当前地区信息则设成tz指向的结构体数据。

gz是设置时区信息,一般为NULL,标示不设置,其并不会影响日历时间,就是给时区变量赋值。


返回<0代表设置失败

  1. Struct tmieval{  
  2.     time_t tv_sec; /*秒s 日历时间
  3.     suseconds_t tv_usec; /*微秒us*/  
  4. };  

  1. struct timezone{  
  2.     int tz_minuteswest; /*miniutes west of Greenwich*/  
  3.     int tz_dsttime; /*type of DST correction*/  
  4. };  

[cpp] view plain copy print?
  1. int main(void)  
  2. {  
  3.     char t_string[] = "2012-04-28 22:30:00";  
  4.     struct tm time_tm;  
  5.     struct timeval time_tv;  
  6.     time_t timep;  
  7.     int ret = 0;  
  8.   
  9.     sscanf(t_string, "%d-%d-%d %d:%d:%d", &time_tm.tm_year, &time_tm.tm_mon, &time_tm.tm_mday, &time_tm.tm_hour, &time_tm.tm_min, &time_tm.tm_sec);  
  10.     time_tm.tm_year -= 1900;  
  11.     time_tm.tm_mon -= 1;  
  12.     time_tm.tm_wday = 0;  
  13.     time_tm.tm_yday = 0;  
  14.     time_tm.tm_isdst = 0;  
  15.   
  16.     timep = mktime(&time_tm);  
  17.     time_tv.tv_sec = timep;  
  18.     time_tv.tv_usec = 0;  
  19.   
  20.     ret = settimeofday(&time_tv, NULL);  
  21.     if(ret != 0)  
  22.     {  
  23.         fprintf(stderr, "settimeofday failed\n");  
  24.         return -1;  
  25.     }  
  26.     return 0;  
  27. }  


0 0
原创粉丝点击