【问题标题】:Issue with calculating elapsed minutes between two dates计算两个日期之间经过的分钟数的问题
【发布时间】:2016-10-02 11:03:16
【问题描述】:

我有以下代码来计算开始日期和结束日期之间的分钟数。它还考虑了工作时间(9 到 5),因此它不应计算工作时间以外的任何内容。

如果 startdate 和 enddate 在工作时间范围内,它可以正常工作,但如果 startdate 在工作时间之外(早上 9 点之前),则返回负数。

private static int GetMinutesBetweenTwoDates(DateTime startDate, DateTime endDate)
{
    var minutes = from day in startDate.DaysInRangeUntil(endDate)
                  where !day.IsWeekendDay()
                  let start = Max(day.AddHours(9), startDate)
                  let end = Min(day.AddHours(17), endDate)
                  select (end - start).TotalMinutes;
}

private static DateTime Max(DateTime a, DateTime b)
{
    return new DateTime(Math.Max(a.Ticks, b.Ticks));
}

private static DateTime Min(DateTime a, DateTime b)
{
    return new DateTime(Math.Min(a.Ticks, b.Ticks));
}

public static IEnumerable<DateTime> DaysInRangeUntil(this DateTime start, DateTime end)
{
    return Enumerable.Range(0, 1 + (int)(end.Date - start.Date).TotalDays)
        .Select(dt => start.Date.AddDays(dt));
}

public static bool IsWeekendDay(this DateTime dt)
{
    return dt.DayOfWeek == DayOfWeek.Saturday
           || dt.DayOfWeek == DayOfWeek.Sunday;
}

谢谢

【问题讨论】:

  • 不要写 linq,这样你就可以调试你的代码。找到问题后,开始为它编写适当的 linq(如果你愿意的话)。
  • 银行假期怎么样?
  • @batwad 我有一个单独的逻辑,可以从总经过的分钟数中删除银行假日分钟数。

标签: c# asp.net .net linq c#-4.0


【解决方案1】:

我认为您需要使用end &lt;= start 过滤案例,如果开始日期时间在工作时间结束之后或结束日期时间在工作时间开始之前,可能会发生这种情况。更容易的是插入额外的where 子句:

private static int GetMinutesBetweenTwoDates(DateTime startDate, DateTime endDate)
{
    var minutes = from day in startDate.DaysInRangeUntil(endDate)
                  where !day.IsWeekendDay()
                  let start = Max(day.AddHours(9), startDate)
                  let end = Min(day.AddHours(17), endDate)
                  where end > start
                  select (end - start).TotalMinutes;
    return (int)minutes.Sum();
}

【讨论】:

    【解决方案2】:

    以防万一,有这个非常有用的时间段库:

    CodeProject : Time Period Library for .NET

    【讨论】:

      猜你喜欢
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 2019-01-14
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多