【问题标题】:DateTime.Compare() is returning 1 on identical DateTimes [duplicate]DateTime.Compare() 在相​​同的 DateTimes 上返回 1 [重复]
【发布时间】:2019-08-08 20:25:59
【问题描述】:

我一直致力于通过 EntityFramwork 6 获取消息。

基本上,我有一个 API 可以传递一个日期,然后我使用 EntityFramework 来获取最新消息。

现在当我使用 DateTime.Compare(date1, date2) 结果为 1 时,这是不正确的,因为日期相同。

你可以在这张图片中看到:

日期相同,但 testd = 1

任何想法为什么会发生这种情况?

代码如下:

var result = ChatProvider
                .GetAllChatsForUser(memberUser.UserName)
                .Where(x => x.FromUser.Equals(lastMessage.FromUser)).OrderBy(x => x.DateTimeCreated).LastOrDefault();

            var testd = DateTime.Compare(result.DateTimeCreated, Date);

谢谢!

【问题讨论】:

  • 我们看不到图像中的值是相同的 - 我们只能看到秒。我的猜测是它们具有不同的亚秒级值。尝试查看每个值的 Ticks 属性。

标签: c# entity-framework-6


【解决方案1】:

Microsoft 的 Reference Source for DateTime.Compare 显示(在第 565 行说明)

public static int Compare(DateTime t1, DateTime t2) {
    Int64 ticks1 = t1.InternalTicks;
    Int64 ticks2 = t2.InternalTicks;
    if (ticks1 > ticks2) return 1;
    if (ticks1 < ticks2) return -1;
    return 0;
}

这证实了 Jon Skeet 的假设,即必须存在亚秒级差异。特别是,不会考虑像DateTimeKind 这样的其他信息。

在与此函数进行比较之前,您可以四舍五入到所需的精度(当然这不适用于 EF,必须在客户端完成)。

private DateTime Round(DateTime dt, TimeSpan precision)
{
    return new DateTime(((dt.Ticks + precision.Ticks/2) / precision.Ticks) * precision.Ticks);
}

这样使用

var oneSecond = TimeSpan.FromSeconds(1);
var testd = DateTime.Compare(
    Round(result.DateTimeCreated, oneSecond),
    Round(Date, oneSecond));

【讨论】:

  • 我更改了代码以传递刻度而不是日期,然后使用您的比较方法。谢谢!!!
  • 注意,这不是我的比较方法。这是微软内置的DateTime.Compare 方法。我的建议是在进行比较之前将我的round方法应用于两个日期。
  • 啊,刚刚看了。太着急了!在将刻度转换为 DateTime 之后,我更新了代码以进行标准比较,并且它可以工作。谢谢!
猜你喜欢
  • 2016-01-18
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 2010-12-11
  • 2013-04-22
相关资源
最近更新 更多