将日期时间与毫秒精度进行比较
本文关键字:精度 比较 日期 时间 | 更新日期: 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
的某种变体,并且忘记指定您希望捕获毫秒部分,以便将它们设置为每个实例的零。