在LINQ中确定具有分钟精度的Datetime值的相等性

7

我需要比较两个日期时间值以确定它们是否相等,使用分钟精度。这是最好的方法吗?我的日期可能有秒和毫秒,但我只想考虑到分钟。

       where (Math.Abs(datetime1.Subtract(datetime2).TotalMinutes) == 0)

我会将那段代码片段发布为您问题的答案,这样人们就可以单独对其进行评论/投票。 - Allen Rice
3个回答

13

检查 Math.Abs(diff.TotalMinutes) == 0 是否为真是不行的,因为这会检查它们是否完全相同

你是想检查它们是否在同一分钟内,还是是否少于一分钟?如果是前者,请使用:

where RoundToMinute(dateTime1) == RoundToMinute(dateTime2)

声明为:

public static DateTime RoundToMinute(DateTime time)
{
    return new DateTime(time.Year, time.Month, time.Day,
                        time.Hour, time.Minute, 0, time.Kind);
}

对于第二个问题,使用以下代码:

where Math.Abs((dateTime1 - dateTime2).TotalMinutes) < 1

顺便提一下,你应该考虑在一个时间为本地时间,另一个时间为UTC时的结果是什么...

注意,这里没有任何特定于LINQ的内容 - 假设你正在使用LINQ to Objects。如果你正在使用LINQ to SQL,那么显然你不能使用本地方法,我们必须再看一下...

编辑:我仍然非常不清楚你的问题。如果你需要它们是完全相同的日期/时间,那很容易(抛开可能出现的本地与UTC问题):

where dateTime1 == dateTime2

然而,这就引出了一个问题,为什么你在问题标题中提到“分钟精度”,或者在问题正文中提到“使用最多分钟精度”。


Jon - 我对使用RoundToMinute(datetime)感到谨慎,因为传入的日期可能带有秒数,而我想保持分钟精度。虽然Math.abs也可能会出现问题,我猜?当然,在使用日期之前,我可以(应该)去掉秒!但是为了回答你的问题,是的,我确实需要它们完全相同。 - PreethaA
1
@Preetha:如果你需要它们完全相同,那么根据问题标题,你需要什么样的“分钟精度”? - Jon Skeet
如果您有日期时间值,无法确定它们是否附带秒数,但您只关心它们是否完全相同...直到分钟。我想stripseconds部分应该是完全独立的,并且应该在实际比较值之前进行,这样在这种情况下就可以起作用。 - PreethaA
1
DateTime没有“附加秒”的概念 - 它们始终具有“Second”值。也许已经设置了有意义的值,也可能没有 - 您无法确定。听起来我的答案可能是您想要的,但是您需要在脑海中清楚地知道您想要发生什么。编写一些单元测试以展示您想要的行为,然后查看我的代码是否使您的单元测试通过。 - Jon Skeet

0

怎么样?

where (Math.Floor(datetime1.Ticks / 600000000) == Math.Floor(datetime2.Ticks / 600000000))

?


当我看到这个问题时,这正是我所想到的(关于编程的)。 - Allen Rice
如果你指的是 datetime1.Millisecond,那不对 - 它的值始终在0到999之间。 - Jon Skeet

0

谢谢Allen,我会这样做的(还在弄清楚整个过程的具体方式!)。以下是代码片段,指示我最初得出的答案:

(Math.Abs(datetime1.Subtract(datetime2).TotalMinutes) == 0)

背景:在我的Linq查询的WHERE子句中(因此是一行代码),我需要检查datetime1和datetime2是否完全相同。考虑的datetime值是用于查询中使用的其他值的时间戳日期。


正如我在答案中编辑的那样,只需使用dateTime1 == dateTime2。请更新您的问题,以摆脱“使用最多一分钟的精度”,因为那不是“完全相同”的意思。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接