从和到过滤器的日期,不带时间c#mvc

本文关键字:时间 c#mvc 日期 过滤器 | 更新日期: 2023-09-27 18:25:36

我在mvc应用程序中有两个输入:date_from和date_to(这是只显示日期,而不是DateTime)

当我调用一个服务以获得由这些值过滤的结果时,我调用

Result result = client.GetResults(from = date_from, to = date_to);

GetResults中的逻辑在EF5上执行linq,如下所示:

context.Results.Where(r=> r.date >= date_from && r.date <= date_to);

由于视图只有DateTime的日期部分,如果我通过起始日期:2013-12-01至:2013-12-01

我得到的唯一结果是0:0:0

我想做的是调用以到为日期结束的服务。

  • 注意:我不想更改服务逻辑,因为时间在其他地方使用
  • 注2:我不想发送date_to.AddDays(1),因为它会在0:0:0时显示另一个日期的数据

什么是好的解决方案?我想出了date_to.AddDays(1).AddMilliseconds(-1),但认为这不是一个好方法。

谢谢。

从和到过滤器的日期,不带时间c#mvc

最简单的方法是添加一天,但将上限更改为独占:

var lowerBoundInclusive = date_from;
var upperBoundExclusive = date_to.AddDays(1);
context.Results.Where(r=> r.date >= lowerBoundInclusive && 
                          r.date < upperBoundExclusive);

像这样的半开区间很好,因为它们自然相邻——你可以使用一个区间的独占上界作为下一个区间,等等——每个值都会正好落入一个区间。这也意味着每个边界都是很好的圆形值,很容易阅读。

编辑:好吧,有了这些评论,听起来我们已经有所进展了——问题是,当你同时处理"仅日期"answers"日期和时间"时,.NET使用DateTime。通常,在用日期表示间隔时,您使用包含的间隔("我在周一至周五度假"),而在日期和时间时,您则使用exclusive上限("我的第一次会议是3:00-4:00,我的第二次会议是4:00-5:00。"-在4:00,您的第一次会结束,第二次会开始。)

我建议编写两种方法,其中一种可以调用另一种:

// This is *inclusive* of both bounds
public XYZ GetResultsByDate(DateTime fromDate, DateTime toDate)
{
    return GetResultsByDateAndTime(fromDate.Date, toDate.Date.AddDays(1));
}
// This is *exclusive* of the upper bound
public XYZ GetResultsByDateAndTime(DateTime from, DateTime to)
{
    var results = context.Results.Where(r=> r.date >= from && r.date < to);
    ...
}