将日期时间与毫秒精度进行比较

本文关键字:精度 比较 日期 时间 | 更新日期: 2023-09-27 17:57:02

我试图在 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));

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

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

将日期时间与毫秒精度进行比较

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

时间值以 100 纳秒为单位(称为刻度)进行测量,特定日期是自公历日历中公元 0001 年 1 月 1 日午夜 12:00 (C.E.) 以来的刻度数 (来源)

当你使用 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 的某种变体,并且忘记指定您希望捕获毫秒部分,以便将它们设置为每个实例的零。