为什么写此文章: 就为这一个问题硬折磨了一下午.
如果你有这么一件事要做,那么没经历过的人一定会郁闷,这就是为什么写下的理由.
假设我们已经知道要设置的时间为Year,Mon,Day,Hour,Min,Sec,因此需要写这么一个修改Linux系统时间的函数:
这里的年是指没有千位和百位的,比如2013,这里输入为13
void SetSysTimeInfo(unsigned long Year,unsigned long Mon,unsigned long Day,
unsigned long Hour,unsigned long Min,unsigned long Sec)
{
printf("DateTime1:%d-%d-%d %d:%d:%d\n",Year,Mon,Day,Hour,Min,Sec);
struct tm time ={0};
time.tm_sec =Sec;
time.tm_min =Min;
time.tm_hour =Hour;
time.tm_mday =Day;
time.tm_mon =Mon-1;//settimeofday的月份范围为0~11
time.tm_year =Year+2000-1900;//settimeofday的年是从1900开始计算的,1900年为0
time.tm_wday =GetDayofYear(Year,Mon,Day);//其实这里也可以不设置
time.tm_yday =GetWeekDay(Year,Mon,Day);//其实这里也可以不设置
time.tm_isdst =0;//其实这里也可以不设置
time_t time1 =mktime(&time);
printf("time1=%d\n",time1);
struct timeval time2={0};
time2.tv_sec =time1;
time2.tv_usec =0;
int ret =settimeofday(&time2,NULL);
printf("ret=%d\n",ret);
if(ret <0)
{
perror("settimeofday err");
}
//读取设置好的年月日时分秒
struct timeval time3={0};
gettimeofday(&time3,NULL);
printf("time3=%ld\n",time3.tv_sec);
struct tm *ptm;
ptm =localtime(&time3.tv_sec);
//同理,年和月得经过逆运算还原
printf("DateTime2:%d-%d-%d %d:%d:%d\n",ptm->tm_year+1900-2000,ptm->tm_mon+1,ptm->tm_mday,ptm->tm_hour,ptm->tm_min,ptm->tm_sec);
}
上面GetDayofYear为计算当前日期为一年中的第几天,GetWeekDay为计算日期为星期天.函数分别如下所示:
//根据年月日计算这年中第几天
static int GetDayofYear(int year,int mon,int day)
{
int d =0;
year +=2000;
if((year%4==0 &&year%100!=0)||(year%400==0))//闫年
{
switch(mon)
{
case 1:
d+=0;
break;
case 2:
d+=31;
break;
case 3:
d+=60;
break;
case 4:
d+=91;
break;
case 5:
d+=121;
break;
case 6:
d+=152;
break;
case 7:
d+=182;
break;
case 8:
d+=213;
break;
case 9:
d+=244;
break;
case 10:
d+=274;
break;
case 11:
d+=305;
break;
case 12:
d+=335;
break;
}
}
else//平年
{
switch(mon)
{
case 1:
d+=0;
break;
case 2:
d+=31;
break;
case 3:
d+=59;
break;
case 4:
d+=90;
break;
case 5:
d+=120;
break;
case 6:
d+=151;
break;
case 7:
d+=181;
break;
case 8:
d+=212;
break;
case 9:
d+=243;
break;
case 10:
d+=273;
break;
case 11:
d+=304;
break;
case 12:
d+=334;
break;
}
}
d+=day;
printf("d=%d\n",d);
return d;
}
GetWeekDay函数如下定义:
//根据年月日计算是星期几
static int GetWeekDay(int year,int mon,int day)
{
year +=2000;
int y =year%100;
int c =20;
int m =mon;
int d =day;
int w;
if(mon ==1)
{
m =13;
y =(year-1)%100;
c =(year-1)/100;
}
else if(mon ==2)
{
m =14;
y =(year-1)%100;
c =(year-1)/100;
}
w =y+(int)(y/4)+(int)(c/4)-2*c+(int)(26*(m+1)/10)+d-1; //这是一个标准公式
w %=7;
printf("w=%d\n",w);
return w;
}
记录下此经历.