C# 不包括使用Nodatime的期间中的日期

C# 不包括使用Nodatime的期间中的日期,c#,nodatime,C#,Nodatime,我试图计算两个LocalDateTime值之间的时间量,并排除特定日期(在本例中,是银行假日) differenceBetween值显示两个日期之间的天数/小时/分/秒,如您所料 我可以检查从开始日期起的每一天,看看bankHolidays集合是否包含该日期,例如 var bankHolidays = new[] { new LocalDate(2013, 12, 25), new LocalDate(2013, 12, 26) }; var localDateTime1 = new Local

我试图计算两个
LocalDateTime
值之间的时间量,并排除特定日期(在本例中,是银行假日)

differenceBetween
值显示两个日期之间的天数/小时/分/秒,如您所料

我可以检查从开始日期起的每一天,看看
bankHolidays
集合是否包含该日期,例如

var bankHolidays = new[] { new LocalDate(2013, 12, 25), new LocalDate(2013, 12, 26) };
var localDateTime1 = new LocalDateTime(2013, 11, 18, 10, 30);
var localDateTime2 = new LocalDateTime(2013, 12, 29, 10, 15);

var differenceBetween = Period.Between(localDateTime1, localDateTime2, PeriodUnits.Days | PeriodUnits.HourMinuteSecond);

var london = DateTimeZoneProviders.Tzdb["Europe/London"];

for (var i = 1; i < differenceBetween.Days; ++i)
{
    var x = localDateTime1.InZoneStrictly(london) + Duration.FromStandardDays(i);

    if (bankHolidays.Any(date => date == x.Date))
    {
        //subtract one day for the period.
    }
}
var bankHolidays=new[]{new LocalDate(2013,12,25),new LocalDate(2013,12,26)};
var localDateTime1=新的LocalDateTime(2013,11,18,10,30);
var localDateTime2=新的LocalDateTime(2013,12,29,10,15);
var differenceBetween=Period.Between(localDateTime1、localDateTime2、PeriodUnits.Days | PeriodUnits.HourMinuteSecond);
var london=DateTimeZoneProviders.Tzdb[“欧洲/伦敦”];
对于(var i=1;idate==x.date))
{
//在这段时间里减去一天。
}
}
我觉得我遗漏了一些显而易见的东西,应该有一个更简单的方法,有没有更简单的方法来找出两个日期之间的时间段,同时排除某些日期


我还需要将周末也包括在这个排除项中,最明显的方式似乎是在检查银行假期的同时检查一周中的周末,但这似乎不是最好/正确的处理方式。

只需使用
TimeSpan
获得差异,所有时间都在您当前的本地时区:

var bankHolidays = new[] { new DateTime(2013, 12, 25), new DateTime(2013, 12, 26) };
var localDateTime1 = new DateTime(2013, 11, 18, 10, 30, 0);
var localDateTime2 = new DateTime(2013, 12, 29, 10, 15, 0);
var span = localDateTime2 - localDateTime1;
var holidays = bankHolidays[1] - bankHolidays[0];
var duration = span-holidays;
现在
duration
是您在
localDateTime1
localDateTime2
之间经过的时间。 如果要通过
银行假日
排除两个日期,可以轻松修改上述操作

您可以为此操作使用额外的方法:

public static TimeSpan GetPeriod(DateTime start, DateTime end, params DateTime[] exclude)
{
    var span = end - start;
    if (exclude == null) return span;
    span = exclude.Where(d => d >= start && d <= end)
    .Aggregate(span, (current, date) => current.Subtract(new TimeSpan(1, 0, 0, 0)));
    return span;
}
我觉得我遗漏了一些显而易见的东西,应该有一个更简单的方法,有没有更简单的方法来找出两个日期之间的时间段,同时排除某些日期

那么,计算日期范围内的银行假期数量相对容易:

  • 按时间顺序排列所有的银行假日
  • 使用二进制搜索找出开始日期在集合中的位置
  • 使用二进制搜索找出集合中的结束日期
  • 将一个索引与另一个索引相减,以确定该范围内的条目数
  • 使用
    period.Between
    计算整个期间,就像你已经做的那样
  • 从范围内的总天数中减去范围内的条目数
fiddly bit考虑到开始和/或结束日期可能是银行假日。有很多可能出现一个接一个的错误,但是如果有一组好的单元测试,应该可以

或者,如果您的银行假期相对较少,您可以使用:

var period = Period.Between(start, end,
                            PeriodUnits.Days | PeriodUnits.HourMinuteSecond);
var holidayCount = holidays.Count(x => x >= start && x <= end);
period = period - Period.FromDays(holidayCount);
var period=period.Between(开始、结束、,
PeriodUnits.Days | PeriodUnits.HourMinuteSecond);

ValayHealayCalt=假期。计数(x=>x>=Stand & x)你只想排除银行假日,还是你想排除定期假日?无论是在<代码>银行假日> /代码>集合中,它都是手动设置的。你认为什么是“常规假日”??我想到了不是工作日的每一天,即典型的周六和周日。周末实际上不是我考虑的事情,但是的,我也需要取消周六和周日。
var duration = GetPeriod(localDateTime1, localDateTime2, bankHolidays);
var period = Period.Between(start, end,
                            PeriodUnits.Days | PeriodUnits.HourMinuteSecond);
var holidayCount = holidays.Count(x => x >= start && x <= end);
period = period - Period.FromDays(holidayCount);