当前位置: 技术问答>linux和unix
烦人的linux时区问题,????
来源: 互联网 发布时间:2016-10-19
本文导语: 本帖最后由 zhoujiawen 于 2010-11-19 20:31:02 编辑 两块板A和B之间进行通讯,时间差7个小时,A、B板子的情况如下 A:linux系统,时钟芯片RS5C372 B:uClinux系统,应用程序完全由A移植过来,包括时钟驱动, A、B板子的硬件结...
A:linux系统,时钟芯片RS5C372
B:uClinux系统,应用程序完全由A移植过来,包括时钟驱动,
A、B板子的硬件结构完全一样,只是CPU不一样,编译器不同,应用程序和驱动都是由A移植过来。
现在遇到时区的问题,麻烦的要死,不知道怎么去搞他,
具体流程如下:
1.开机由时钟芯片读取时间并配置系统时间,在应用程序中B(主机)给A调时,时间格式为年、月、日、时、分、秒,
A收到后进行系统时间配置,调时后,A、B界面显示时间一致,
2.A的事件传送到B,其中时间采用unsigned int time传送即秒值,B传送到A的也一样,现在问题来了,
A→B的事件,在B上显示出来多出来7个小时,如A:2010/11/19 20:15:28 在B上显示为2010/11/20 03:15:28多了7个小时
B→A的事件,在A上就少了7个小时,如B:2010/11/19 20:02:31到A上变为2010/11/19 13:02:31
A和B的处理方式一样,当事件产生时,time的值的操作为time(&time)取当前系统时间,B对time的解析方法为
struct tm *temptm;
temptm=localtime((time_t *)(&buf->time));
i+=sprintf(strTemp+i, " %.4d/%.2d/%.2d %.2d:%.2d:%.2d",
temptm->tm_year+1900,
temptm->tm_mon+1,
temptm->tm_mday,
temptm->tm_hour,
temptm->tm_min,
temptm->tm_sec);
A、B两个系统配置系统时间的方式一样如下
int config_sysytime(void)
{
int fd;
unsigned char tbuf[7];
/* Open the RTC device */
fd = open(RTC_DEVICE, O_RDONLY);
if (fd > 4) & 0x7);
tm.tm_min = tbuf[1];//(tbuf[1] & 0xf) + 10 * ((tbuf[1] >> 4) & 0x7);
tm.tm_hour = tbuf[2];//(tbuf[2] & 0xf) + 10 * ((tbuf[2] >> 4) & 0x3);
tm.tm_mday = tbuf[4];//(tbuf[4] & 0xf) + 10 * ((tbuf[4] >> 4) & 0x3);
tm.tm_mon = tbuf[5]-1;//(tbuf[5] & 0xf) + 10 * ((tbuf[5] >> 4) & 0x1) - 1;
tm.tm_year = 100+tbuf[6];//100 + (tbuf[6] & 0xf) + 10 * ((tbuf[6] >> 4) & 0xf);
tm.tm_wday = (tbuf[3] & 0x7) - 1;
tm.tm_yday = moffset[tm.tm_mon] + tm.tm_mday - 1;
tm.tm_isdst = -1;
time_t t;
t = mktime(&tm);
stime(&t);
close(fd);
return(0);
}
我估计是两个linux系统默认所处的时区不一样所导致,但不知道该怎么去解决
在B板子上的终端上输入date -R查看时区显示如下
# date -R
Fri, 19 Nov 2010 20:04:02 +0000
配置系统时间时的输出信息
Clock: old time 1970/01/01 - 00:00:05 GMT
Clock: new time 2010/11/19 - 20:01:15 GMT
A由于是老产品,没有consle查看输出
|
好像涉及时间问题的有个utc的什么时间服务器吧,先把时间统一了,然后自己的时区再自己计算。