什么';这是比较两个日期时间相等的最佳方法;s在C#中。。。但只是精确到某个程度?

什么';这是比较两个日期时间相等的最佳方法;s在C#中。。。但只是精确到某个程度?,c#,datetime,date,C#,Datetime,Date,我有两个日期时间,一个来自时间戳,另一个我在代码中生成。我需要测试他们的平等性,我很想不用太多的表达。下面是我两次约会的一个例子: DateTime expireTimeStampUTC = DateTime.Parse(UTCValueFromDatabase)); DateTime expectedExpireTime = DateTime.UtcNow.AddHours(NumberOfExpectedHoursInConfig); 这是太高的测试精度: 如果(exp

我有两个日期时间,一个来自时间戳,另一个我在代码中生成。我需要测试他们的平等性,我很想不用太多的表达。下面是我两次约会的一个例子:

DateTime expireTimeStampUTC = 
    DateTime.Parse(UTCValueFromDatabase));
DateTime expectedExpireTime = 
    DateTime.UtcNow.AddHours(NumberOfExpectedHoursInConfig);
这是太高的测试精度:

如果(expireTimeStampUTC.Equals(expectedExpireTime)){}

我不在乎它们是否精确到第二个,只是时间

这样做可能是最好的解决方案吗

if (expireTimeStampUTC.Date.Equals(expectedExpireTime.Date))
{
    if (!expireTimeStampUTC.Hour.Equals(expectedExpireTime.Hour))
    {
        pass = false;
    }
}

我不是最有经验的C#。。。有什么简单的方法可以做到这一点吗?

构造新的DateTime对象并比较它们。在C#中,以这种方式构造“一次性”对象的代价很小。

找出这两个小时之间的差异,看看它是否低于某个阈值(比如一小时3600秒)

var diff=expireTimeStamp.Subtract(expectedExpireTime).TotalSeconds;
通过=数学绝对值(差值)<3600;

减去它们。检查结果是否在某个最大范围内。

如果您遇到的问题是因为它们是数据库类型,您可以转换为该类型并在那里进行比较,我们在大约1/3的数据库存储上损失/获得大约一毫秒转换为SQLDateTimes

如果不是,请比较您真正关心的单位:

DateTime dt1 = DateTime.UtcNow;
DateTime dt2 = DateTime.UtcNow.AddMinutes(59); // or 1 or 61 for test values;

// if the dates are in the same hour (12:10 == 12:50, 1:58 != 2:02)
if(dt1.Hour == dt2.Hour) // result
或者如果你关心他们在一小时内

// if the dates are within one hour of each other (1:58 == 2:02, 3:30 != 4:45)
if((dt1 - dt2).Duration() < TimeSpan.FromHours(1)) // result
//如果日期在一小时之内(1:58==2:02,3:30!=4:45)
if((dt1-dt2).Duration()
这里减去日期生成一个时间跨度,持续时间是“绝对值”,然后我们根据我们关心的单位(从小时)明确创建限制并进行比较


最后一行是我认为在特定的时间跨度内实现相等的最简洁的一行。

我在尝试编写提交然后检索业务对象的单元测试时遇到了这个问题。我试图使用对象的“StartTime”属性来确保可以检索该对象,但遇到了这个问题。数据库中提交的“StartTime”值在Ticks值中丢失了6位精度

下面是我如何重写我的测试条件,以便我的测试能够正确执行并通过。相关行是块的倒数第二行

DateTime start = DateTime.Now;
NewEventInfo testEvent1 = FakeEvent("test01action", start); //plus other params for testing
mServiceClient.AddEvent(testEvent1);

EventInfo[] eventInfos = null; //code to get back events within time window

Assert.IsNotEmpty(eventInfos);
Assert.GreaterOrEqual(eventInfos.Length, 1);

EventInfo resultEvent1 = eventInfos.FirstOrDefault(e => 
e.Action == "test01action" &&
Math.Abs(e.StartTime.Subtract(testEvent1.StartTime).TotalMilliseconds) < 1000); //checks dates are within 1 sec
Assert.IsNotNull(resultEvent1);
DateTime start=DateTime.Now;
NewEventInfo testEvent1=FakeEvent(“test01action”,开始)//加上其他测试参数
mServiceClient.AddEvent(testEvent1);
EventInfo[]eventInfos=null//获取时间窗口内事件的代码
IsNotEmpty(eventInfos);
Assert.GreaterOrEqual(eventInfos.Length,1);
EventInfo resultEvent1=eventInfos.FirstOrDefault(e=>
e、 操作==“test01action”&&
Abs(例如StartTime.Subtract(testEvent1.StartTime.total毫秒)<1000)//检查日期在1秒之内
Assert.IsNotNull(resultEvent1);
通过这种方式,我可以确保对象是单元测试提交的对象,因为EventInfo.StartTime属性只使用精度为1秒的日期时间


编辑:添加了Math.Abs(大约DateTime diff),以确保绝对值与1000进行比较。

非常好。。。这是一个非常明显的愚蠢答案,我会为自己没有想到这一点而自责。谢谢还有一个代码示例。神奇。也许不是在你的C#中!是时候升级到VisualStudio2008了,伙计!:)狂野的。我想如果我开始使用它,我的开发负责人会杀了我。关于“var”没有什么坏处。在我上面的代码片段中,“diff”变量的含义是显而易见的,您不关心它的编译时类型。(是双精度?整数?长?谁在乎呢?)。我认为发生的事情更清楚。我以前从未更改过“正确答案”标记,但我认为在这种情况下,这是更好的解决方案。这很公平。我想是六个一个/半打另一个。“Duration()”语法可能更具可读性,但它的开销(无可否认可以忽略)是在比较的两侧更新时间跨度。DateTime值支持减法操作。你得到一个时间跨度,你检查它是否小于指定的时间间隔。这和我刚才说的差不多。
DateTime start = DateTime.Now;
NewEventInfo testEvent1 = FakeEvent("test01action", start); //plus other params for testing
mServiceClient.AddEvent(testEvent1);

EventInfo[] eventInfos = null; //code to get back events within time window

Assert.IsNotEmpty(eventInfos);
Assert.GreaterOrEqual(eventInfos.Length, 1);

EventInfo resultEvent1 = eventInfos.FirstOrDefault(e => 
e.Action == "test01action" &&
Math.Abs(e.StartTime.Subtract(testEvent1.StartTime).TotalMilliseconds) < 1000); //checks dates are within 1 sec
Assert.IsNotNull(resultEvent1);