日期:2014-05-16  浏览次数:21622 次

真心求助!!!mktime() 和 settimeofday使用方法!
以下是我自己写的一个设置系统时间的函数
但是运行结果mktime() 函数得到的秒数一直是-1,所以settimeofday函数返回值一直是-1,
请求高手看一下我的代码哪里出了问题!!
(注:datetime_t 是我自己定义的一个结构体,和tm的结构一样,通过这个参数传递进来我自己设定的时间)
void set_system_time(datetime_t ptime)
{
    struct tm * stime;
    struct timeval tv;
    time_t timep,timeq;
    int rec;

    time(&timep);
    stime = localtime(&timep);

    stime->tm_sec = ptime.second;
    stime->tm_min = ptime.minute;
    stime->tm_hour = ptime.hour;
    stime->tm_mday = ptime.day;
    stime->tm_mon = ptime.month;
    stime->tm_year = ptime.year;

    timeq = mktime(stime);
    tv.tv_sec = (long)timeq;
    printf("the second: %ld",tv.tv_sec);
    tv.tv_usec = 0;

    rec = settimeofday(&tv,NULL);
    if(rec <0 )
    {
        printf("settimeofday failed!\n");
    }
    else
    {
        printf("Set system time ok!\n");
    }
}

------解决方案--------------------
如果datetime_t时间的定义和tm是一样的,那这样修改该就可以了。
    stime->tm_mon = ptime.month - 1;
    stime->tm_year = ptime.year - 1900;
用man mktime查看帮助,得到如下信息:
    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_year的0值是对应于1900年。

另外修改系统时间是需要管理员权限的,修改完成后最好立即用hwclock命令更新到RTC。