比较datetime和毫秒精度

时间:2013-01-31 12:30:01

标签: c# asp.net-mvc linq datetime

我正在尝试比较asp.net中的2个日期时间,但它忽略了毫秒部分。

我尝试过使用linq:

messages.OrderBy(x => x.Date);

并尝试了

messages.OrderBy(x => x.Date).ThenBy(x=>x.Date.Millisecond);

并使用sort

messages.Sort((x, y) => DateTime.Compare(x.Date, y.Date));

并尝试使用字符串格式转换日期时间,但它也忽略了毫秒。

对象中的datetime字段正确地带有日期时间毫秒。 我正在使用Asp.net MVC3与数据库Informix,Oracle和SQL Server。

1 个答案:

答案 0 :(得分:5)

你在某个地方犯了一个错误,DateTime在内部存储为数字

  

时间值以称为刻度线的100纳秒单位测量,特定日期是格里高利历日历中自0001年1月1日午夜12点(格林威治标准时间)以来的刻度数。   (source

使用DateTime排序时,它只是使用此基础值进行整数排序。因此,如果您的DateTime实例具有有关毫秒数的信息,则它将包含在排序中。这可以使用以下代码进行演示:

var dates = new[]{
    new DateTime(2013,1,31,12,0,0,10),
        new DateTime(2013,1,31,12,0,0,20),
        new DateTime(2013,1,31,12,0,0,5)
};

foreach(var date in dates)
{
    Console.WriteLine("{0:yyyy-MM-dd HH:mm:ss.fff}", date);
}

Console.WriteLine("-------------");

foreach(var date in dates.OrderBy(dt => dt))
{
    Console.WriteLine("{0:yyyy-MM-dd HH:mm:ss.fff}", date);
}

给出了输出:

2013-01-31 12:00:00.010
2013-01-31 12:00:00.020
2013-01-31 12:00:00.005
-------------
2013-01-31 12:00:00.005
2013-01-31 12:00:00.010
2013-01-31 12:00:00.020

清楚地证明正确排序日期时间列表会先放置先前的毫秒数。

亲自尝试:http://rextester.com/HYQIM13679

至于为什么这不会发生在你身上,这是不可能回答的,因为你没有提供你如何通过包含你正在排序的DateTime字段的对象列表来详细说明。一种可能性是您的源数据实际上是一个字符串,并且您正在使用DateTime.Parse / DateTime.ParseExact的某些变体,并且已指定您希望捕获毫秒部分以便将它们设置为零每个例子。