DateTime.Compare无法按预期工作

时间:2017-03-07 13:55:32

标签: c# .net datetime

我正在尝试比较两个DateTime对象,忽略带有以下函数的秒数,但即使两个DateTime对象具有相同的值,它也会给出错误的结果。无法弄清楚如何使其正常工作,任何帮助都将受到高度赞赏。

public static int CompareDateTime(DateTime d1, DateTime d2)
{
    d1 = d1.AddSeconds(-1 * d1.Second);
    d2 = d2.AddSeconds(-1 * d2.Second);

    int result = DateTime.Compare(d1, d2);
    string relationship;

    if (result < 0)
        relationship = "is earlier than";
    else if (result == 0)
        relationship = "is the same time as";
    else
        relationship = "is later than";

    Console.WriteLine("{0} {1} {2}", d1, relationship, d2);

    return result;

}

结果:

3/7/2017 2:54:00 PM is later than 3/7/2017 2:54:00 PM

3 个答案:

答案 0 :(得分:7)

这里的问题是你没有像你期望的那样截断。截断的最佳方法是通过执行以下操作从构造函数创建一个全新的DateTime对象:

d1 = new DateTime(d1.Year, d1.Month, d1.Day, d1.Hour, d1.Minute, 0);
d2 = new DateTime(d2.Year, d2.Month, d2.Day, d2.Hour, d2.Minute, 0);

这将确保您只是比较您想要的数据。

在这种特定情况下,它可能是您尝试截断所留下的日期时间的一部分。

答案 1 :(得分:3)

你也需要忽略毫秒。您可以将其添加到您的代码中,或者使用@Chris建议的更“优雅”的解决方案

d1 = d1.AddMilliseconds(-1 * d1.Millisecond);
d2 = d2.AddMilliseconds(-1 * d2.Millisecond);

答案 2 :(得分:3)

每个人都在提供截断时间的解决方案......所以我会给出我通常使用的那个...... A DateTime是从1月1日0:00:00开始的滴答数, 0001 ...所以,如果您知道一分钟内有多少个刻度(有一个只读字段:TimeSpan.TicksPerMinute),您可以计算从0001年1月1日起的分钟数......

long minutes1 = d1.Ticks / TimeSpan.TicksPerMinute;
long minutes2 = d2.Ticks / TimeSpan.TicksPerMinute;

int result = minutes1.CompareTo(minutes2);

(请注意TimeSpan中有各种“有用”值:TicksPerDayTicksPerHourTicksPerMinuteTicksPerSecondTicksPerMillisecond