You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将日期列表按从近到远排序(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:14:59