我正在尝试比较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。
答案 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
的某些变体,并且已指定您希望捕获毫秒部分以便将它们设置为零每个例子。