|
GetLocalTime()函数返回的时间值的年份有误
[复制链接]
问题如上所述。我使用的WINCE5.0系统,当系统出现秒数等于0的时候,会出现获取到的年份不对,如下:
15:38:05.875 系统时间:2010年2月1日 15:37:59
15:38:05.938 系统时间:2016年2月1日 15:38:0
这里看到当秒数从59变为0以后,系统时间年份就开始变为2016了。这个并不是偶然的,而是每次都如此。网上说是2010问题,认为是BSP的函数OEMGetRealTime()的bug所导致的。于是找到这个函数,可是并没有发现网上所说的问题,关键部分如下:
pRTCReg = OALPAtoVA(S3C2440A_BASE_REG_PA_RTC, FALSE);
do {
data = INPORT32(&pRTCReg->BCDSEC) & 0x7f;
seconds = FROM_BCD(data);
data = INPORT32(&pRTCReg->BCDYEAR);
pTime->wYear = FROM_BCD(data) + RTC_YEAR_DATUM;
data = INPORT32(&pRTCReg->BCDMON) & 0x1f;
pTime->wMonth = FROM_BCD(data);
data = INPORT32(&pRTCReg->BCDDAY) & 0x3f;
pTime->wDay = FROM_BCD(data);
pTime->wDayOfWeek = (WORD)INPORT32(&pRTCReg->BCDDATE) - 1;
data = INPORT32(&pRTCReg->BCDHOUR) & 0x3f;
pTime->wHour = FROM_BCD(data);
data = INPORT32(&pRTCReg->BCDMIN) & 0x7f;
pTime->wMinute = FROM_BCD(data);
data = INPORT32(&pRTCReg->BCDSEC) & 0x7f;
pTime->wSecond = FROM_BCD(data);
pTime->wMilliseconds = 0;
} while (pTime->wSecond != seconds);
无可奈何之下,我只好做了一些投机的办法,就是当读取到秒数为0的时候,则不获取时间值。可是,随后我发现,在分钟跳变的时候,也会出现年份的异常,虽然概率要比秒数为0的少了很多,如下:
17:11:06.094 [GetTime]系统时间:2010-2-1 17:10:59
17:11:07.594 [GetTime]系统时间:2016-2-1 17:11:1
17:33:06.109 [GetTime]系统时间:2010-2-1 17:32:59
17:33:07.609 [GetTime]系统时间:2016-2-1 17:33:1
从上面的两部分输出看到跳变都是发生在秒数改变导致分数改变的时候,不过因为我已经过滤了秒数为0的情况,所以概率会很低。我估计了一下,有一段时间是20分钟左右才会出现,因为不是每次跳变都会出现,下面是不会出现的输出,给大家比较一下:
17:30:06.672 [GetTime]系统时间:2010-2-1 17:29:59
17:30:07.609 [GetTime]系统时间:2010-2-1 17:30:1
17:31:06.234 [GetTime]系统时间:2010-2-1 17:30:59
17:31:07.609 [GetTime]系统时间:2010-2-1 17:31:1
17:32:06.234 [GetTime]系统时间:2010-2-1 17:31:59
17:32:07.422 [GetTime]系统时间:2010-2-1 17:32:1
有谁遇到过这个问题的吗?怎么解决的?本人的cpu是三星的2440
|
|