天天看點

linux下修改系統時間

當然不是通過指令,指令的話要好好看下date,因為這兩天的任務一直是系統時間相關,這裡隻是簡明說說settimeofday這個函數.

NAME

       gettimeofday, settimeofday - get / set time

SYNOPSIS

       #include <sys/time.h>

       int gettimeofday(struct timeval *tv, struct timezone *tz);

       int settimeofday(const struct timeval *tv, const struct timezone *tz);

DESCRIPTION

       The functions gettimeofday() and settimeofday() can get and set the time as well as a timezone.

       The tv argument is a struct timeval (as specified in <sys/time.h>):

           struct timeval {

               time_t      tv_sec;    

               suseconds_t tv_usec;    

           };

       and gives the number of seconds and microseconds since the Epoch (see time(2)).  The  tz  argu-

       ment is a struct timezone:

           struct timezone {

               int tz_minuteswest;    

               int tz_dsttime;        

           };

       If either tv or tz is NULL, the corresponding structure is not set or returned.

settimeofday用于修改目前系統時間(隻改變系統時間,不改變硬體時鐘時間,有的硬體上有RTC子產品),tv表示需要設定的時間,tz表示時區。

把tm時間格式轉換成tv->tv_sec:

struct tm {

               int tm_sec;        

               int tm_min;        

               int tm_hour;        

               int tm_mday;        

               int tm_mon;        

               int tm_year;        

               int tm_wday;        

               int tm_yday;        

               int tm_isdst;      

};

The members of the tm structure are:

       tm_sec The  number of seconds after the minute, normally in the range 0 to 59, but can be up to

              60 to allow for leap seconds.

       tm_min The number of minutes after the hour, in the range 0 to 59.

       tm_hour

              The number of hours past midnight, in the range 0 to 23.

       tm_mday

              The day of the month, in the range 1 to 31.

       tm_mon 

The number of months since January, in the range 0 to 11.

       tm_year

              The number of years since 1900.

       tm_wday

              The number of days since Sunday, in the range 0 to 6.

       tm_yday

              The number of days since January 1, in the range 0 to 365.

tm_isdst

              A flag that indicates whether daylight saving time is in effect at the  time  described.

              The value is positive if daylight saving time is in effect, zero if it is not, and nega-

              tive if the information is not available.

将tm格式時間轉換time_t,可以用mktime()或者timegm(),是以可以設定好tm結構中的值後,用這兩個函數轉換,最後調用settimeofday即可:

void default_system_time()
{
    struct timeval tv;
    struct tm rtm;
    memset(&rtm, 0, sizeof(rtm));
    memset(&tv, 0, sizeof(tv));

    rtm.tm_year = 70;
    rtm.tm_mon = 1;
    rtm.tm_mday = 1;
    rtm.tm_hour = 0;
    rtm.tm_min = 0;
    rtm.tm_sec = 0;

    /* convert tm to timeval.sec */
    //tv.tv_sec = timegm(&rtm);
    tv.tv_sec = mktime(&rtm);

    settimeofday(&tv, NULL);
}
           

繼續閱讀