如何将日期列表按从近到远排序(C#)
搞定日期排序的问题!
先帮你拆解下当前的问题:
你现在的代码是通过计算每个日期和当前时间的时间差绝对值,再用OrderBy升序排列——这个逻辑本身是对的:时间差越小(离现在越近)的项会排在前面。但你得到的结果和预期相反,大概率是下面两个原因之一:
情况1:你其实要的是「日期从早到晚」排序,而非「离现在从近到远」
从你给出的预期结果(09/12/2018 → 10/12/2018 → 11/12/2018)来看,这明显是按日期本身的先后顺序升序排列,根本不需要计算和now的差值。这种情况下,直接解析日期后排序就行:
// 按日期升序排列(早的在前) var ordered = herds.HerdList.OrderBy(n => DateTime.Parse(n.Date_Visit));
⚠️ 这里有个很容易踩的坑:DateTime.Parse会跟着系统默认的文化格式走。如果你的系统默认是mm/dd/yyyy(比如英文环境),那09/12/2018会被解析成9月12日,而不是你想要的12月9日,排序结果肯定就乱了。所以一定要指定格式解析,避免文化差异:
using System.Globalization; // 匹配你的日期格式:dd/mm/yyyy hh:mm:ss tt var dateFormat = "dd/MM/yyyy hh:mm:ss tt"; var ordered = herds.HerdList.OrderBy(n => DateTime.ParseExact(n.Date_Visit, dateFormat, CultureInfo.InvariantCulture) );
情况2:你确实需要「离现在从近到远」,但要么排序方向反了,要么日期解析错了
如果当前时间是在11/12/2018之后,那11号离现在最近,10号次之,09号最远,这时候你的原代码结果是正确的。但如果你想要反过来(比如当前时间在09号之前,想让09号排第一),却得到了相反的结果,那99%是日期解析出错了(就是上面说的格式问题)。
如果你的需求是「离现在越远的排在前面」(和当前代码结果相反),那直接把OrderBy改成OrderByDescending就行:
var now = DateTime.Now; var ordered = herds.HerdList.OrderByDescending(n => (now - DateTime.Parse(n.Date_Visit)).Duration());
最后再梳理下:
- 要「日期从早到晚」:用
OrderBy直接排解析后的日期,记得指定解析格式 - 要「离现在从近到远」:确保日期解析正确,原代码逻辑没问题;如果结果反了,检查当前时间和目标日期的关系,或者切换排序方向
内容的提问来源于stack exchange,提问作者SmiffyKmc
相关产品推荐
相关产品推荐

