【问题标题】:DateTime comparison logic日期时间比较逻辑
【发布时间】:2021-02-02 15:04:26
【问题描述】:

我正在使用代码将DateTime转换为long,反之亦然。 我发现了一个有趣的观察结果。以下是我的代码:

DateTime dt = new DateTime(123456);
int isEqual  = DateTime.Compare(dt.ToLocalTime(), DateTime.MinValue.ToLocalTime());
if (isEqual == 0)
{
    Console.WriteLine("Date is Equal");
}

我调试并检查了两个值,

dt is {1/1/0001 12:00:00 AM}

DateTime.MinValue is also {1/1/0001 12:00:00 AM}

我想知道为什么isEqual 的值是1 而不是0

当比较两个值时using string.Equals() 方法;它返回了false

需要一个理由。

【问题讨论】:

  • 你有什么困惑?如果Compare返回1,则表示第一个参数大于第二个。如果两个参数相等,Compare 返回 0new DateTime(123456) 确实大于DateTime.MinValue
  • 不要将 dt 用于 DataTime。大多数人将 dt 用于 DataTable。
  • 会记住的。
  • 试试dt.ToString("MM/dd/yyyy HH:mm:ss.fffffff"),注意它比DateTime.MinValue晚0.0123456秒

标签: c# date


【解决方案1】:

DateTime 对象使用 DateTime 对象的 Ticks 属性来比较 2 个 DateTime 对象。

根据 MS Docs:

单个滴答表示一百纳秒或百万分之一秒。一毫秒有 10,000 个滴答声(请参阅 TicksPerMillisecond),而每秒有 1000 万个滴答声。

因此,即使在秒级上也能看到日期对象的差异,您的刻度值应该大于 1000 万。因此,在您传递小于 10000000 的数字之前,您不会看到 DateTime.MinValue 和您通过将刻度传递给构造函数创建的 DateTime 对象之间的日期字符串差异。 如果您没有意识到,您使用的构造函数传入单个 Int64,将其作为刻度数。

有关详细信息,请参阅 MS Docs: https://docs.microsoft.com/en-us/dotnet/api/system.datetime.compare?view=net-5.0 https://docs.microsoft.com/en-us/dotnet/api/system.datetime.ticks?view=net-5.0

TL;DR; DateTime 对象使用 DateTime 对象的 Ticks 属性来比较 2 个 DateTime 对象。因此,由于刻度数不同,所以 isEqual 为 1,但由于刻度之间的差异小于 1000 万,您在日期时间字符串上看不到它。尝试查询 Ticks 属性以了解 compareTo 返回 1 的原因。

【讨论】:

    【解决方案2】:

    我想知道为什么 isEqual 的值是 1 而不是 0。

    仅仅是因为new DateTime(123456) 代表DateTime,即123456 的刻度大于DateTime.MinValue

    new DateTime()(没有任何刻度),这也是 DateTime 的默认值,是唯一真正等于 DateTime.MinValue 的值:

    DateTime dt = new DateTime();
    int isEqual = DateTime.Compare(dt.ToLocalTime(), DateTime.MinValue.ToLocalTime());
    if (isEqual == 0)
    {
        Console.WriteLine("Date is Equal");
    }
    

    当您在调试器中查看DateTime 的值时,默认情况下看不到Ticks 部分。但是如果你扩展变量,你会注意到它就在那里:

    【讨论】:

    • @NishantKumar:这回答了你的问题还是剩下什么?
    猜你喜欢
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    相关资源
    最近更新 更多