比较两个date时间时忽略毫秒
这可能是一个愚蠢的问题,但我似乎无法弄清楚。 我比较两个文件的LastWriteTime,但它总是失败,因为我从网上下载的文件总是有毫秒设置为0,我的原始文件有一个实际值。 有一个简单的方法来比较时忽略毫秒?
这是我的function:
//compare file's dates public bool CompareByModifiedDate(string strOrigFile, string strDownloadedFile) { DateTime dtOrig = File.GetLastWriteTime(strOrigFile); DateTime dtNew = File.GetLastWriteTime(strDownloadedFile); if (dtOrig == dtNew) return true; else return false; }
提前致谢
创build一个新的DateTime值,并将毫秒组件设置为0:
dt = dt.AddMilliseconds(-dt.Millisecond);
我build议你使用一个扩展方法:
public static DateTime TrimMilliseconds(this DateTime dt) { return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, 0); }
那么它只是:
if (dtOrig.TrimMilliseconds() == dtNew.TrimMilliseconds())
如果dt
具有非零微秒 (millis的几分之一),应该小心。 仅将毫秒设置为零是不够的。
要将millis和below设置为零(并获得成功的比较),代码将为:
dt = dt.AddTicks(-dt.Ticks % TimeSpan.TicksPerSecond); // TimeSpan.TicksPerSecond=10000000
TimeSpan difference = dtNew - dtOrig; if (difference >= TimeSpan.FromSeconds(1)) { ... }
你可以减去它们,得到一个TimeSpan
。
然后使用TimeSpan.totalSeconds()
一种方法是创build新的date,将年,月,日,小时,分钟,秒input到构造函数中。 或者,您可以简单地比较每个值。
这对于单个截断来说是矫枉过正,但是如果你有几种不同的types,你可以使用下面的广义的扩展方法来做到这一点:
DateTime dtSecs = DateTime.Now.TruncateTo(Extensions.DateTruncate.Second); DateTime dtHrs = DateTime.Now.TruncateTo(Extensions.DateTruncate.Hour);
更一般的使用扩展方法:
public static DateTime TruncateTo(this DateTime dt, DateTruncate TruncateTo) { if (TruncateTo == DateTruncate.Year) return new DateTime(dt.Year, 0, 0); else if (TruncateTo == DateTruncate.Month) return new DateTime(dt.Year, dt.Month, 0); else if (TruncateTo == DateTruncate.Day) return new DateTime(dt.Year, dt.Month, dt.Day); else if (TruncateTo == DateTruncate.Hour) return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, 0, 0); else if (TruncateTo == DateTruncate.Minute) return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, 0); else return new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second); } public enum DateTruncate { Year, Month, Day, Hour, Minute, Second }
以太在您的其他date时间毫秒设置为零,或从另一个date减去一个date,只是检查结果时间跨度的TotalMinutes
属性。
您可以创build一个扩展方法,将DateTime对象的毫秒设置为零
public static DateTime ZeroMilliseconds(this DateTime value) { return new DateTime(value.Year, value.Month, value.Day, value.Hours, value.Minutes, value.Seconds); }
然后在你的function
if (dtOrig.ZeroMilliseconds() == dtNew.ZeroMilliseconds()) return true; else return false;
强制sortingstring并进行比较。 简单,运行良好。
return string.Compare(dtOrig.ToString("s"), dtNew.ToString("s"), StringComparison.Ordinal) == 0;
截断时间最直接的方法是格式化它,并parsing你想要的单位:
var myDate = DateTime.Parse(DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss"));
DOK的方法被重写
public bool CompareByModifiedDate(string strOrigFile, string strDownloadedFile) { DateTime dtOrig = DateTime.Parse(File.GetLastWriteTime(strOrigFile).ToString("MM/dd/yyyy hh:mm:ss")); DateTime dtNew = DateTime.Parse(File.GetLastWriteTime(strDownloadedFile).ToString("MM/dd/yyyy hh:mm:ss")); if (dtOrig == dtNew) return true; else return false; }
不知道为什么几乎所有的程序员都需要额外的行来从一个带有boolexpression式的函数中返回一个bool值。
代替
if (dtOrig.ZeroMilliseconds() == dtNew.ZeroMilliseconds()) return true; else return false;
你可以随时使用
return dtOrig.ZeroMilliseconds() == dtNew.ZeroMilliseconds()
如果expression式为真,则返回true,否则返回false。