使用DateTimeOffset减1天出错,无法正确统计近24小时订单
问题分析与解决
错误原因
- 精确匹配逻辑错误:用
==直接比较DateTimeOffset值,要求两个时间的年、月、日、时、分、秒、毫秒完全一致。但你传入的datetime是UtcNow(包含当前精确到毫秒的时间),减去一天后得到的是类似2024-06-02 15:30:22.123 +00:00的时间,而测试数据里的订单时间是2024-06-02 00:00:00.000 +00:00,两者不可能相等,所以统计结果为0,而非预期的3。 - 需求匹配错误:你的需求是统计最近24小时或昨日的订单,但代码逻辑却是找和“当前时间减一天”这个单一精确时刻完全匹配的订单,完全不符合需求。
修正方案
根据需求分两种场景处理:
场景1:统计最近24小时内的订单(从当前时间往前推24小时)
int ordersTierAmount(DateTimeOffset datetime) { var twentyFourHoursAgo = datetime.Subtract(TimeSpan.FromDays(1)); var all = GetAll(); // 筛选确认时间晚于等于24小时前的订单 var count = all.Count(i => i.ConfirmedDateTime >= twentyFourHoursAgo); return count; }
场景2:统计昨日自然日的订单(不管当前时间,仅日期为昨天)
如果需要按自然日统计昨日订单,需先确定昨日的起始和结束时间:
int ordersTierAmount(DateTimeOffset datetime) { // 获取UTC时间的昨日起始(0点0分) var yesterdayStart = datetime.Date.Subtract(TimeSpan.FromDays(1)); // 获取今日起始(即昨日结束的下一秒) var todayStart = datetime.Date; var all = GetAll(); // 筛选确认时间在昨日起始(含)到今日起始(不含)之间的订单 var count = all.Count(i => i.ConfirmedDateTime >= yesterdayStart && i.ConfirmedDateTime < todayStart); return count; }
补充说明
DateTimeOffset.Date会返回该时间的日期部分,时间置为00:00:00,适合按自然日筛选。- 比较时间范围时,推荐用
>=和<的组合,避免因毫秒精度导致的遗漏或错误匹配。
内容的提问来源于stack exchange,提问作者KeithViking
相关产品推荐
相关产品推荐

