默认情况下,C#将DateTime对象与100ns刻度进行比较.但是,我的数据库将DateTime值返回到最接近的毫秒.使用指定的容差比较C#中两个DateTime对象的最佳方法是什么?
编辑:我正在处理截断问题,而不是舍入问题.正如Joe在下面指出的那样,舍入问题将引入新的问题.
适合我的解决方案是以下组合.
(dateTime1 - dateTime2).Duration() < TimeSpan.FromMilliseconds(1)
如果差异小于1毫秒,则返回true.对Duration()的调用很重要,以获得两个日期之间差异的绝对值.
我通常使用TimeSpan.FromXXX方法做这样的事情:
if((myDate - myOtherDate) > TimeSpan.FromSeconds(10)) { //Do something here }
如何使用DateTime的扩展方法来创建一个流畅的界面(那些风靡一时吧?)
public static class DateTimeTolerance { private static TimeSpan _defaultTolerance = TimeSpan.FromSeconds(10); public static void SetDefault(TimeSpan tolerance) { _defaultTolerance = tolerance; } public static DateTimeWithin Within(this DateTime dateTime, TimeSpan tolerance) { return new DateTimeWithin(dateTime, tolerance); } public static DateTimeWithin Within(this DateTime dateTime) { return new DateTimeWithin(dateTime, _defaultTolerance); } }
这依赖于一个类来存储状态并为==和!=定义一对运算符重载:
public class DateTimeWithin { public DateTimeWithin(DateTime dateTime, TimeSpan tolerance) { DateTime = dateTime; Tolerance = tolerance; } public TimeSpan Tolerance { get; private set; } public DateTime DateTime { get; private set; } public static bool operator ==(DateTime lhs, DateTimeWithin rhs) { return (lhs - rhs.DateTime).Duration() <= rhs.Tolerance; } public static bool operator !=(DateTime lhs, DateTimeWithin rhs) { return (lhs - rhs.DateTime).Duration() > rhs.Tolerance; } public static bool operator ==(DateTimeWithin lhs, DateTime rhs) { return rhs == lhs; } public static bool operator !=(DateTimeWithin lhs, DateTime rhs) { return rhs != lhs; } }
然后在您的代码中,您可以:
DateTime d1 = DateTime.Now; DateTime d2 = d1 + TimeSpan.FromSeconds(20); if(d1 == d2.Within(TimeSpan.FromMinutes(1))) { // TRUE! Do whatever }
扩展类还包含默认的静态容差,以便您可以为整个项目设置容差,并使用不带参数的Within方法:
DateTimeTolerance.SetDefault(TimeSpan.FromMinutes(1)); if(d1 == d2.Within()) { // Uses default tolerance // TRUE! Do whatever }
我有一些单元测试但是这里的代码太多了.
您需要从日期对象中删除毫秒组件.一种方法是:
DateTime d = DateTime.Now; d.Subtract(new TimeSpan(0, 0, 0, 0, d.Millisecond));
您还可以减去两个日期时间
d.Subtract(DateTime.Now);
这将返回一个timepan对象,您可以使用它来比较日,小时,分钟和秒组件以查看差异.