这两天写代码时居然遇到一件非常奇怪的现象,我要判断一个dbf文件的上次修改日期,并与保存在数据库中的日期进行对比,如果更新,则进行数据同步,并将同步时的文件日期保存下来供下次判断。
我使用了这样的代码来判断
string file=row["SourceTable"].ToString();
FileInfo info = new FileInfo(file);
DateTime sourceTime,fileTime;
DateTime.TryParse(row["SourceMark"].ToString(), out sourceTime);
if (info.LastWriteTime > sourceTime)
{
//执行同步操作
}
else
{
//....
}
在XP下调试一切正常,可是在Windows 2008 Server下,总是不断的进行同步操作,if (info.LastWriteTime > sourceTime)语句一直判断为真,也就是数据库中保存的日期总是被判定为小于文件日期。
于是怀疑代码有问题,后来又怀疑数据库保存时没有正确保存,检查了两天,发现代码没有任何问题,而且在XP下一切正常。
在实在没有办法的情况下,只有改用日期差值来判断
TimeSpan span = fileTime - sourceTime;
结果一下就出来了,原来两个日期相差500多毫秒,难怪比较结果值不对。
估计C#在2008的系统下,得到的文件修改日期精确到毫秒,而XP下则只精确到秒,保存数据时数据库中DateTime类型也只精确到秒,所以在2008下就出现了错误的结果,而XP下一切正常。当然,也可能是NTFS文件系统与FAT32的不同,而非操作系统的原因,具体原因也没有再追究,解决问题就好。
结论:在进行日期比较时,一定要注意精度问题,最好用TimeSpan来进行判断,而不要用简单的==操作