如何修改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;
}

记录下此经历.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值