比较datetime和毫秒精度

Raf*_*ael 1 c# linq asp.net-mvc datetime

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

我试过用linq:

messages.OrderBy(x => x.Date);
Run Code Online (Sandbox Code Playgroud)

并尝试过

messages.OrderBy(x => x.Date).ThenBy(x=>x.Date.Millisecond);
Run Code Online (Sandbox Code Playgroud)

并且还使用排序

messages.Sort((x, y) => DateTime.Compare(x.Date, y.Date));
Run Code Online (Sandbox Code Playgroud)

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

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

Jam*_*iec 5

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

时间值以称为刻度线的100纳秒单位测量,特定日期是格里高利历日历()中自公元0001年1月1日午夜12:00起的刻度数(来源)

当您使用a排序时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);
}
Run Code Online (Sandbox Code Playgroud)

这给出了输出:

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
Run Code Online (Sandbox Code Playgroud)

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

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

至于为什么这不适合你,这是不可能回答的,因为你没有提供你如何通过包含DateTime你正在分类的字段的对象列表的详细信息.一种可能性是,你的源数据实际上是一个字符串,你正在使用的一些变种DateTime.Parse/ DateTime.ParseExact并福尔戈指定你想捕捉毫秒一部分,所以他们正在设置为零的每个实例.