pinkyuanxue的个人主页

一块来学习!!!

http://www.qtcn.org/bbs/u/126669  [收藏] [复制]

pinkyuanxue

奋斗.....

  • 23

    关注

  • 26

    粉丝

  • 39

    访客

  • 等级:新手上路
  • 总积分:9
  • 女,1990-01-28

最后登录:2013-07-11

更多资料

日志

C语言零碎记录之Linux下C语言关于时间的函数

2012-07-09 15:33
转载自:http://www.cnblogs.com/ayanmw/archive/2011/12/22.html
在手册上有 time ctime  gmtime localtime asctime mktime settimeofday,gettimeofday等时间函数
还有UTC和本机时间和这些函数的区别.了解这些 是linux时间编程必须得!
首先说基本的结构体和typedef 以及define:

time_t   <time.h>

#ifndef __TIME_T
#define __TIME_T     /* 避免重复定义 time_t */
typedef long     time_t;    /* 时间值time_t 为长整型的别名*/
#endif使用方法是 time(&time_tvar);这样time函数会返回 且 给这个地址的time_t类型的变量赋值为一个单位为秒的值(从1970-1-1 0:0:0到现在这一秒的数目,其最大是32位(4294967296),但是没有unsigned只好一半;2011.12.22大约是1324544508,距离其饱满大约还有几十年,即使是unsigned,从1970年开始 只有132.95年,到2103年(4194288000),这个数值将溢出..汗,下次再设计的时候 希望不要再考虑 几个字节.应该尽量的大...)
对于从1970年到现在的秒,我自己也写了一个算法:int getDaysSinceYear(){//0-365 not including this year!
  time_t t;time(&t);
  struct tm *p;
  p=localtime(&t);
  return p->tm_yday;
}


int getDaysSinceYear2(int year,int mon,int day){//这个是另外一个算法,范围1-366.所以应该-1 来达到上面的目的
    int myyday=0;
    mon--;//last Month and before
    while(mon>0){//from 1 to last month!!!!!!!!!!
        switch(mon){
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:myyday+=31;break;
            case 4:
            case 6:
            case 9:
            case 11:myyday+=30;break;
            case 2:myyday+=28;break;
            default:break;
        }
        mon--;
    }
    myyday+=day;//And Plus this month's days
    if(year%4==0)myyday+=1;// 2 yue if it is 29 days!!!
    return myyday;
}

int getSecondsByTime(int year,int month,int days,int hour,int minute,int second){
//input format : 2011 11 11 11 11 11

printf("%d-%d-%d %d:%d:%d == input time\n",year,month,days,hour,minute,second);

    int daySeconds=24*60*60;
    seconds=hour*60*60+minute*60+second;//this year!
    seconds+=(getDaysSinceYear())*daySeconds;
    year--;//so not including this year!
    for(;year>=1970;year--){//1970 - last year!
        seconds+=365*daySeconds;
        if(year%4==0)seconds+=daySeconds;
    }
    seconds-=8*60*60;//UTC Time .Current +8 hours beijing!
    printf("%d == seconds(1970) in UTC\n",seconds);
    return seconds;
}
最后获得的秒我有一个操作 :seconds-=8*60*60;为什么这么做?因为 我的电脑设置显示本地时间(即不是UTC时间)如果按照UTC时间那需要+8个小时的.(windows上也默认是local时间,不是UTC的,所以经常出现俩时间不同步的问题,只要取消linux的UTC就可以了,在/etc/rc.conf类似的文件中设置我的是archlinux)
这个时间是从BIOS获取的,操作系统要处理这个时间,如果以UTC时间来处理,那么把BIOS时间当 UTC+0的时间,我们设置了UTC的timezone区域是 北京 UTC+8,所以linux此时就会把系统时间+8个小时就超时了...(后来我改成local时间,重启系统,时间恢复,比之前-8小时,一些文件的时间就惨了..提示 比现在靠后8小时...),所以time()是UTC+0的时间,如果系统设置UTC timezone为+0 我想就没着问题了吧...汗啊..谁叫我们的时间比他们UTC+0时区要早8个小时呢.即使改成系统时间为BIOS本地时间,在编程他还是获得的是UTC时间,我们如果要获得当前的时间,需要-8小时.太恶心了.
从时间变成秒,linux没有直接的函数.但是从秒变成 时间的结构体就有了!!gmtime(&time_tVar)和localtime(&time_tVar);这俩的区别就是 UTC,又是它 恶心啊...秒是当前时间的秒,UTC+0,使用gmtime获得UTC+0的时间,localtime获得本地时间UTC+8,localtime是正确的.
现在时间就是下面的这个...还是说明 t 是UTC+0的时间.
分类:C/C++学习|回复:0|浏览:1644|全站可见|转载
 

Powered by phpwind v8.7 Certificate Copyright Time now is:05-14 18:32
©2005-2016 QTCN开发网 版权所有 Gzip disabled