【问题标题】:Comparing 2 dates and ignoring milliseconds of difference比较 2 个日期并忽略毫秒的差异
【发布时间】:2013-07-15 18:25:24
【问题描述】:

我有 2 个日期,我如何比较这 2 个日期并忽略毫秒的差异?

DateTime dte1 = (DateTime)entity.secondDate;
DateTime dte2 = (DateTime)entity.firstDate;

if (DateTime.Compare(dte1, dte2)!=0)
    throw new HttpRequestException(ExceptionMessages.CONCURRENCY_UPDATE);

谢谢。

【问题讨论】:

  • 当你说“忽略毫秒”时,你的意思是除了毫秒之外的一切都是一样的,或者你想看看两个 DateTimes 是否在 X 毫秒之内?
  • 重复,但正如 Jeppe Stig Nielson 指出的那样,那里(和这里)接受的答案是错误的。正确的答案要么是 catfood's here,您可以将差异与固定容差进行比较,或者是 Dean Chalk 对另一个问题的回答,您可以在其中创建全新的 DateTime 对象,并且只包括年、月、日、小时、分钟、秒,然后您可以比较这些对象。取决于您是要在误差范围内进行比较,还是要通过减少毫秒来进行比较。
  • @JoeEnos 我还在此线程上发布了关于 Dean Chalk 的效果的答案。希望 OP 在实现不起作用的代码之前看到这一点。

标签: c# asp.net


【解决方案1】:

如果我们将您的问题理解为“我如何比较两个 DateTime 对象并在它们相隔小于例如 100 毫秒时将它们视为相等,这是最简单的方法?”

double diff = if (dte1.Subtract(dte2)).TotalMilliseconds;
if (Math.Abs(diff) < 100)
{
    Console.WriteLine("It's all good.");
}

【讨论】:

  • 可以想象有两个 DateTimes 相差不到一秒,但 Second 属性的值不同,但这里的问题是模棱两可的......
  • 同意。这对我的回答有什么影响?
  • 12:00:00.94012:00:01.001 相比会有 61 毫秒的差异,因此它们“都很好”,但对于此应用程序可能有所不同(12:00:00 vs 12:00:01)
  • 正如你所注意到的,这个问题是模棱两可的。我调整了答案以表明我的解释。
  • 您的解决方案肯定更安全。谢谢。
【解决方案2】:

我做了这个扩展方法

public static bool IsEqual(this DateTime start, DateTime end, long toleranceInMilliseconds = -1)
{
    if (toleranceInMilliseconds < 0)
       toleranceInMilliseconds = 0;

    return Math.Abs((start - end).TotalMilliseconds) < toleranceInMilliseconds;
}

【讨论】:

    【解决方案3】:

    为什么不将DateTime 解析为您最期望的精度(我假设您想要 yyyy-MM-dd HH:mm:ss)。然后比较它们。我意识到这有点啰嗦,但仍然是一个答案。

    DateTime dte1 = (DateTime)entity.secondDate;
    DateTime dte2 = (DateTime)entity.firstDate;
    
    if (DateTime.Compare(DateTime.ParseExact(dte1.ToString("yyyy-MM-dd HH:mm:ss"), 
                                                           "yyyy-MM-dd HH:mm:ss", 
                                                            null), 
                         DateTime.ParseExact(dte2.ToString("yyyy-MM-dd HH:mm:ss"), 
                                                           "yyyy-MM-dd HH:mm:ss", 
                                                            null)) != 0)
    {
        throw new HttpRequestException(ExceptionMessages.CONCURRENCY_UPDATE);
    }
    

    抱歉格式错误,只是试图最小化水平滚动。这样就避免了标记答案出现的问题。

    【讨论】:

    • 一些额外的工作来来回翻译字符串,而不是把它们当作数字来处理。但这应该可行,假设您想减少毫秒而不是与容差进行比较。不过,一个更正应该是 HH 而不是 hh,所以你得到的是 24 小时制而不是 12 小时制。
    • 转换为string 并再次转换为DateTime 是不雅且不必要的。乔对HH 的看法是正确的;你可能会在上午/下午放松。否则信息。
    【解决方案4】:

    在比较两者之前,只需执行以下操作:

    firstDateTime = firstDateTime.AddMilliseconds(-firstDateTime.Millisecond);
    secondDateTime = secondDateTime.AddMilliseconds(-secondDateTime.Millisecond);
    

    【讨论】:

    • 不!这只会删除整个毫秒数。例如,如果一天中的时间是20:33:22.1234567,则在您更正之后它将是20:33:22.0004567
    • 如果时间是“20:51:10.999”和“20:51:11.001”,那么这将导致整秒的差异(而不是 2 毫秒)。这个问题不清楚这是否是一个问题。
    • 如果你想截断到整数毫秒,一种方法是firstDateTime = new DateTime(firstDateTime.Ticks / TimeSpan.TicksPerMillisecond * TimeSpan.TicksPerMillisecond);(不一定保留DateTimeDateTimeKind)。另一种方法是firstDateTime = firstDateTime.AddTicks(-(firstDateTime.Ticks % TimeSpan.TicksPerMillisecond));
    猜你喜欢
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 2018-10-15
    • 2017-02-15
    相关资源
    最近更新 更多