日前在一个项目中有UTC时间和本地时间转换的需求,查了查 MSDN,需要先获取TIME_ZONE_INFORMATION 结构,然后用TzSpecificLocalTimeToSystemTime和SystemTimeToTzSpecificLocalTime实现转换。

实现代码如下:

void TimeUtcToLocal(LPSYSTEMTIME lpUtcTime,LPSYSTEMTIME lpSpecificLocalTime)
{
TIME_ZONE_INFORMATION tzInfo;
GetTimeZoneInformation(&tzInfo);
SystemTimeToTzSpecificLocalTime(&tzInfo,lpUtcTime,lpSpecificLocalTime);
}


void TimeLocalToUtc(LPSYSTEMTIME lpSpecificLocalTime,LPSYSTEMTIME lpUtcTime)
{
TIME_ZONE_INFORMATION tzInfo;
GetTimeZoneInformation(&tzInfo);
TzSpecificLocalTimeToSystemTime(&tzInfo,lpSpecificLocalTime,lpUtcTime);
}

在XP上运行,一切正常,放到2k上,问题出来了,LoadLibrary失效,模块无法加载。

在团队一位大哥的帮助下,发现这两个 API在2k的kernel32.dll模块中没有导出地址,问题定位在这两个API是XP中独有的,2k不支持。造成这个错误的原因应该归结为开发人员(PS:也就是我了,呵呵)在开发过程中不够严谨,没有注意到文档中提到的OS版本依赖性。

明白问题后,做如下修改:

void TimeUtcToLocal(LPSYSTEMTIME lpUtcTime,LPSYSTEMTIME lpSpecificLocalTime)
{
FILETIME ftLocal = {0}, ftUtc = {0};
SystemTimeToFileTime(lpUtcTime, &ftUtc);
FileTimeToLocalFileTime(&ftUtc, &ftLocal);
FileTimeToSystemTime(&ftLocal, lpSpecificLocalTime);
}


void TimeLocalToUtc(LPSYSTEMTIME lpSpecificLocalTime,LPSYSTEMTIME lpUtcTime)
{
FILETIME ftLocal = {0}, ftUtc = {0};
SystemTimeToFileTime(lpSpecificLocalTime, &ftLocal);
LocalFileTimeToFileTime(&ftLocal, &ftUtc);
FileTimeToSystemTime(&ftUtc, lpUtcTime);
}

更改后在不同版本OS下运行测试兼容性,一切正常。

题外话:开发人员在研发过程中,任何一行不经意的、没有了解其确切行为的代码,都可能在最终发布的产品中产生不可预期的行为或造成不可挽救的灾难。

解决方法:阅读文档的时候,请不单单只是注意到接口的参数、行为、依赖模块,请顺便注意一下兼容的OS版本。

本文相关评论 - 1条评论都没有呢

目前还没有评论.