dth*_*her 29 c# comparison datetime resolution
默认情况下,C#将DateTime对象与100ns刻度进行比较.但是,我的数据库将DateTime值返回到最接近的毫秒.使用指定的容差比较C#中两个DateTime对象的最佳方法是什么?
编辑:我正在处理截断问题,而不是舍入问题.正如Joe在下面指出的那样,舍入问题将引入新的问题.
适合我的解决方案是以下组合.
(dateTime1 - dateTime2).Duration() < TimeSpan.FromMilliseconds(1)
Run Code Online (Sandbox Code Playgroud)
如果差异小于1毫秒,则返回true.对Duration()的调用很重要,以获得两个日期之间差异的绝对值.
Mic*_*cah 25
我通常使用TimeSpan.FromXXX方法做这样的事情:
if((myDate - myOtherDate) > TimeSpan.FromSeconds(10))
{
//Do something here
}
Run Code Online (Sandbox Code Playgroud)
jos*_*rry 10
如何使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
这依赖于一个类来存储状态并为==和!=定义一对运算符重载:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在您的代码中,您可以:
DateTime d1 = DateTime.Now;
DateTime d2 = d1 + TimeSpan.FromSeconds(20);
if(d1 == d2.Within(TimeSpan.FromMinutes(1))) {
// TRUE! Do whatever
}
Run Code Online (Sandbox Code Playgroud)
扩展类还包含默认的静态容差,以便您可以为整个项目设置容差,并使用不带参数的Within方法:
DateTimeTolerance.SetDefault(TimeSpan.FromMinutes(1));
if(d1 == d2.Within()) { // Uses default tolerance
// TRUE! Do whatever
}
Run Code Online (Sandbox Code Playgroud)
我有一些单元测试但是这里的代码太多了.
您需要从日期对象中删除毫秒组件.一种方法是:
DateTime d = DateTime.Now;
d.Subtract(new TimeSpan(0, 0, 0, 0, d.Millisecond));
Run Code Online (Sandbox Code Playgroud)
您还可以减去两个日期时间
d.Subtract(DateTime.Now);
这将返回一个timepan对象,您可以使用它来比较日,小时,分钟和秒组件以查看差异.
归档时间: |
|
查看次数: |
16901 次 |
最近记录: |