当前位置:  开发笔记 > 编程语言 > 正文

如何在C#中使用指定的容差比较DateTime对象?

如何解决《如何在C#中使用指定的容差比较DateTime对象?》经验,为你挑选了3个好方法。

默认情况下,C#将DateTime对象与100ns刻度进行比较.但是,我的数据库将DateTime值返回到最接近的毫秒.使用指定的容差比较C#中两个DateTime对象的最佳方法是什么?

编辑:我正在处理截断问题,而不是舍入问题.正如Joe在下面指出的那样,舍入问题将引入新的问题.

适合我的解决方案是以下组合.

(dateTime1 - dateTime2).Duration() < TimeSpan.FromMilliseconds(1)

如果差异小于1毫秒,则返回true.对Duration()的调用很重要,以获得两个日期之间差异的绝对值.



1> Micah..:

我通常使用TimeSpan.FromXXX方法做这样的事情:

if((myDate - myOtherDate) > TimeSpan.FromSeconds(10))
{
   //Do something here
}


这应该是`(dateTime1 - dateTime2).Duration()一种略有不同的方式:if((date1 - date2).TotalSeconds> 10)

2> joshperry..:

如何使用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
}

我有一些单元测试但是这里的代码太多了.



3> JoshBerke..:

您需要从日期对象中删除毫秒组件.一种方法是:

    DateTime d = DateTime.Now;
    d.Subtract(new TimeSpan(0, 0, 0, 0, d.Millisecond));

您还可以减去两个日期时间

d.Subtract(DateTime.Now);

这将返回一个timepan对象,您可以使用它来比较日,小时,分钟和秒组件以查看差异.

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有