zoukankan      html  css  js  c++  java
  • Linux时间操作(time、gettimeofday)

    http://blog.chinaunix.net/uid/24148050.html

     http://blog.csdn.net/scottgly/article/details/6568513

    一、time函数   

    1. #include <time.h>
    2. time_t time(time_t *calptr);
    返回距计算机元年的秒数
    一旦取得这种以秒计的很大的时间值后,通常要调用另一个时间函数将其变换为人们可读的时间和日期

    #include <time.h>    
    //calendar time into a broken-down time expressed as UTC
    struct tm *gmtime(const time_t *calptr);

    //converts the calendar time to the local time, taking into account the local time zone and
    //daylight saving time flag
    struct tm *localtime(const time_t *calptr);

    //converts it into a time_t value
    time_t mktime(struct tm *tmptr);

      struct tm {        /* a broken-down time */
         int  tm_sec;     /* seconds after the minute: [0 - 60] */
         int  tm_min;     /* minutes after the hour: [0 - 59] */
         int  tm_hour;    /* hours after midnight: [0 - 23] */
         int  tm_mday;    /* day of the month: [1 - 31] */
         int  tm_mon;     /* months since January: [0 - 11] */
         int  tm_year;    /* years since 1900 */
         int  tm_wday;    /* days since Sunday: [0 - 6] */
         int  tm_yday;    /* days since January 1: [0 - 365] */
         int  tm_isdst;   /* daylight saving time flag: <0, 0, >0 */
       };  
    1. char *asctime(const struct tm *tmptr);
    2. char *ctime(const time_t *calptr);

    3. asctime()和ctime()函数产生形式的26字节字符串,这与date命令的系统默认输出形式类似:
          Tue Feb 10 18:27:38 2004/n/0

    二、gettimeofday函数得到更精确的时间

    1. #include <sys/time.h>
    2. int gettimeofday(struct timeval *restrict tp, void *restrict tzp);
    3. 第二个形参是基于平台实现的,使用的时候最好用NULL
    struct timeval{
        time_t tv_sec;        /*** second ***/
        susecond_t tv_usec;    /*** microsecond 微妙***/
    }

    1秒=1000毫秒,
    1毫秒=1000微秒,
    1微妙=1000纳秒,
    1纳秒=1000皮秒。
    秒用s表现,毫秒用ms,微秒用μs表示,纳秒用ns表示,皮秒用ps表示。

    三、内核时间 

    内核有两个重要的全局变量:
    unsigned long jiffies;
    timeval xtime ;


    jiffies 是记录着从电脑开机到现在总共的"时钟中断"的次数。
    文件linux-2.6.24/kernel/timer.c  
    void do_timer(unsigned long ticks)
    {
        jiffies_64 += ticks;
        update_times(ticks);
    }


    xtime 是从cmos电路或rtc芯片中取得的时间,一般是从某一历史时刻开始到现在的时间。
    这个就是所谓的"墙上时钟walltimer",通过它可计算得出操作系统需要的日期时间,它的精确度是微秒。

    xtime第一次赋值是在系统启动时调用timekeeping_init或time_init进行的
    再调用read_persistent_clock进一步调用get_rtc_time得到的

    PS:在/proc/uptime里面的两个数字分别表示:   
    the uptime of the system(seconds),
    and the amount of time spent in idle process(seconds).   

    四、代码示例

    “UTC时间字符串”与 “time函数返回值”互换
    1. int64_t TimeToUTC(char *time)
    2. {
    3.     struct tm temp1;
    4.     int rc;
    5.     int year;
    6.     int mon;
    7.     int day;
    8.     int hour;
    9.     int min;
    10.     int sec;
    11.     rc = sscanf(time, "%4d-%2d-%2d %2d:%2d:%2d",
    12.                     &(temp1.tm_year),
    13.                     &(temp1.tm_mon),
    14.                     &(temp1.tm_mday),
    15.                     &(temp1.tm_hour),
    16.                     &(temp1.tm_min),
    17.                     &(temp1.tm_sec));
    18.     sscanf(time, "%4d-%2d-%2d %2d:%2d:%2d",
    19.                     &year,
    20.                     &mon,
    21.                     &day,
    22.                     &hour,
    23.                     &min,
    24.                     &sec);
    25.     if((rc<6)
    26.         || (temp1.tm_year<1900) || (temp1.tm_year>2100)
    27.         || (temp1.tm_mon<1) || (temp1.tm_mon>12)
    28.         || (temp1.tm_mday<1) || (temp1.tm_mday>31)
    29.         || (temp1.tm_hour<0) || (temp1.tm_hour>23)
    30.         || (temp1.tm_min<0) || (temp1.tm_min>59)
    31.         || (temp1.tm_sec<0) || (temp1.tm_sec>59))
    32.     {
    33.         return -1;
    34.     }
    35.     temp1.tm_mon -= 1;
    36.     temp1.tm_year -= 1900;
    37.     struct tm temp3;
    38.     time_t temp2 = mktime(&temp1);
    39.     if (temp2 == -1){
    40.         return -1;
    41.     }
    42.     else{
    43.         localtime_r(&temp2, &temp3);
    44.         if (!((mon == (temp3.tm_mon+1))
    45.             && (day == temp3.tm_mday)
    46.             &&(year == (temp3.tm_year+1900)))){
    47.             return -1;
    48.         }
    49.         else{
    50.                 return temp2*1000000LL;
    51.         }
    52.     }
    53. }
    54. void UTCToTime(int64_t utc, char * clock)
    55. {
    56.     struct tm temp1;
    57.     time_t sec;
    58.     float msec;
    59.     int rc;
    60.     sec = utc/1000000;
    61.     msec = utc/1000000.0-sec;
    62.     localtime_r(&sec, &temp1);
    63.     temp1.tm_year += 1900;
    64.     temp1.tm_mon += 1;
    65.     rc = sprintf(clock, "%04d-%02d-%02d %02d:%02d:%02d",
    66.                     temp1.tm_year,
    67.                     temp1.tm_mon,
    68.                     temp1.tm_mday,
    69.                     temp1.tm_hour,
    70.                     temp1.tm_min,
    71.                     temp1.tm_sec);
    72.     clock[rc] = '/0';
    73. }

    生成Date
    1. static char * g_weekstr[7] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
    2. static char * g_monthstr[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
    3.                 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
    4. /*generate the current date string*/
    5. time_t now = time(NULL);
    6. struct tm tt;
    7. gmtime_r( &now, &tt );
    8. char timebuf[64];
    9. snprintf( timebuf, sizeof(timebuf),
    10.         "%s, %02d %s %d %02d:%02d:%02d GMT",
    11.         g_weekstr[tt.tm_wday], tt.tm_mday,
    12.         g_monthstr[tt.tm_mon], tt.tm_year + 1900,
    13.         tt.tm_hour, tt.tm_min, tt.tm_sec );

    ------------------------------ 华丽的分割线 ------------------------------------

    关于scanf的返回值
    Both scanf and wscanf return the number of fields successfully converted
    and assigned; the return value does not include fields that were read but
    not assigned. A return value of 0 indicates that no fields were assigned.
    The return value is EOF for an error or if the end-of-file character or the
    end-of-string character is nocountered in the first attempt to read a character.

    如:scanf("%d%d", &a, &b);
    如果a和b都被成功读入,那么scanf的返回值就是2
    如果只有a被成功读入,返回值为1
    如果a和b都未被成功读入,返回值为0
    如果遇到错误或遇到end of file,返回值为EOF。
    1. void main()
    2. {
    3.     int a;
    4.     int b;
    5.     int c;
    6.     int x;
    7.     printf("请输入三个整数:");
    8.     x=scanf("%d%d%d",&a,&b,&c);
    9.     printf("%d/n%d/n",a,x);
    10. }
    11. 输入三个整数:5 6 7则x的值为3;
    12. 输入5 6 d(即给c 赋值不正确)则x的值为2;
    13. 输入5 t d(即给b和c 赋值不正确)则x的值为1;

    scanf()的返回值对我们来说也很有用的,例如可使用if(scanf("%d,%d",&a,&b)==2)这样语句来判断是否正确的给所有的变量赋值了,正确的话才能使用这个变量与运算,这样才能提高我们代码的安全性。
  • 相关阅读:
    Python3 学习第八弹: 模块学习一之模块变量
    Python3 学习第六弹: 迭代器与生成器
    Python3 学习第五弹:类与面向对象
    Java之泛型
    Java之工具类Collections
    Java之map
    Java集合之List
    Java集合之TreeSet
    Java集合
    Java异常处理
  • 原文地址:https://www.cnblogs.com/0530z/p/3305754.html
Copyright © 2011-2022 走看看