我正在尝试比较两个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
答案 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
中有各种“有用”值:TicksPerDay
,TicksPerHour
,TicksPerMinute
,TicksPerSecond
,TicksPerMillisecond
)