比较两个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。