2

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

我尝试使用 linq:

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

也试过

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

并且还使用排序

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

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

对象中的 datetime 字段正确地以毫秒为单位提供日期时间。我将 Asp.net MVC3 与数据库 Informix、Oracle 和 SQL Server 一起使用。

4

1 回答 1

5

你在某处犯了一个错误,aDateTime在内部存储为一个数字

时间值以 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);
}

这给出了输出:

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并且忘记指定您希望捕获毫秒部分,因此它们对于每个实例都设置为零。

于 2013-01-31T12:44:25.583 回答