C# - 两个DateTimes之间的持续时间(分钟)

Nas*_*sir 20 c# datetime duration

我需要确定两个DateTimes之间的持续时间(以分钟为单位).

然而,有一点点扭曲:

  • 排除周末
  • 只计算在上午7:00到下午7:00之间的分钟数.例如: [09/30/2010 6:39:00 PM] - [09/30/2010 7:39:00 PM] = 21 Minutes

我只是很难找到一个体面的方式去做,如果有人能提出建议,我会很感激.

谢谢.


编辑:

我最终选择了dtb的解决方案.只有一个特殊情况需要注意:如果结束时间是在晚上7点之后,则计算从上午7点到实际结束时间的分钟数.

这是我修改它的方式:

var minutes = from day in start.DaysInRangeUntil(end)
                where !day.IsWeekendDay()
                let st = Helpers.Max(day.AddHours(7), start)
                let en = (day.DayOfYear == end.DayOfYear ? 
                            end :
                            Helpers.Min(day.AddHours(19), end)
                            )
                select (en - st).TotalMinutes;
Run Code Online (Sandbox Code Playgroud)

再一次感谢你的帮助.

dtb*_*dtb 23

当然,您可以使用LINQ:

DateTime a = new DateTime(2010, 10, 30, 21, 58, 29);
DateTime b = a + new TimeSpan(12, 5, 54, 24, 623);

var minutes = from day in a.DaysInRangeUntil(b)
              where !day.IsWeekendDay()
              let start = Max(day.AddHours( 7), a)
              let end   = Min(day.AddHours(19), b)
              select (end - start).TotalMinutes;

var result = minutes.Sum();

// result == 6292.89
Run Code Online (Sandbox Code Playgroud)

(注意:您可能需要检查我完全忽略的很多极端情况.)

助手方法:

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));
}

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

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

static DateTime Min(DateTime a, DateTime b)
{
    return new DateTime(Math.Min(a.Ticks, b.Ticks));
}
Run Code Online (Sandbox Code Playgroud)

  • +1,当我看到这段代码时,我仍然有点畏缩,但我赞赏LINQ的创造性使用. (2认同)
  • @dana:优化正确的解决方案总是比纠正优化的解决方案更容易.我甚至不确定我的比较可读的解决方案在当前形式(角落案例,时区,DST等)中是否正确 (2认同)

Psy*_*nic 5

花点时间,到达当天结束时的分钟数(即晚上7点).

然后从第二天早上7点开始计算最后一天的天数(不包括任何时间到结束日).

计算已经过了多少(如果有的话)周末.(对于每个周末,将天数减少2).

从那里做一些简单的数学计算得到天数的总分钟数.

在最后一天和开始日加时间添加额外时间.