如何修改Linux的系統時間

爲什麼寫此文章: 就爲這一個問題硬折磨了一下午.

如果你有這麼一件事要做,那麼沒經歷過的人一定會鬱悶,這就是爲什麼寫下的理由.


假設我們已經知道要設置的時間爲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;
}

記錄下此經歷.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章