C# 根据工作日的小时数计算小时数

C# 根据工作日的小时数计算小时数,c#,.net,datetime,C#,.net,Datetime,我试图根据每天工作的小时数计算出两个日期之间的天数。我很难计算出一天中选择了多少个完整的半天,例如,如果日历上选择了一天,那么这实际上是一整天 如果选择第一天09:00,第二天13:00,则这将是大约12个工作小时和1.5天 编辑:最后一次,也可能是最后一次更新,它显示了最终结果代码,以使问题在将来更具可读性 仍然需要添加银行假日支票等,但大致如此) //验证工作日规则可用 List lDaysValidated=新列表(); 双D总天数=0; //循环两个日期之间的日期 对于(var day=

我试图根据每天工作的小时数计算出两个日期之间的天数。我很难计算出一天中选择了多少个完整的半天,例如,如果日历上选择了一天,那么这实际上是一整天

如果选择第一天09:00,第二天13:00,则这将是大约12个工作小时和1.5天

编辑:最后一次,也可能是最后一次更新,它显示了最终结果代码,以使问题在将来更具可读性

仍然需要添加银行假日支票等,但大致如此)

//验证工作日规则可用
List lDaysValidated=新列表();
双D总天数=0;
//循环两个日期之间的日期
对于(var day=dtStartDate;day lWorkingDayRules[0].EndTime.TimeOfDay)
{
dtHolidayEndTime=新日期时间(
dtHolidayEndTime.Year,
dtHolidayEndTime.Month,
dHolidayEndTime.Day,
lWorkingDayRules[0]。EndTime.Hour,
lWorkingDayRules[0]。EndTime.Minute,
lWorkingDayRules[0].EndTime.Minute);
}
//检查假期结束时间是否在午餐时间之后,但在一天结束之前
如果(dtHolidayEndTime.TimeOfDay>lWorkingDayRules[0]。午餐时间.TimeOfDay
&&dtHolidayEndTime.TimeOfDay=DTWorkingDay午餐时间)
{
D总天数+=0.5f;
}
//检查是否添加下半天
如果(dtHolidayEndTime>=dtWorkingDayEndTime)
{
D总天数+=0.5f;
}
}
捕获(例外)
{
投掷;
}
}

试试这个。这段代码不是用VS编写的,所以它可能并不完美。。。只使用其中的逻辑

int htot = 0, dtot = 0;
while (date2>date1) {
  int h1 = date1.Hour < work_start ? work_start : date1.Hour;
  int h2 = date1.Hour > work_end ? work_end : date1.Hour;
  htot += (h2-h1);
  dtot++;
  date1 = date1.AddDays(1);
}
inthtot=0,dtot=0;
而(日期2>日期1){
int h1=date1.Hour<工作开始?工作开始:date1.Hour;
int h2=date1.Hour>work\u end?work\u end:date1.Hour;
htot+=(h2-h1);
dtot++;
date1=date1.AddDays(1);
}

别忘了考虑夏令时。我编写了一个库,可以很容易地执行这种计算。它已在一个客户机上全天候投入生产使用一年多,用于各种复杂的全球日历计算。如果您对许可产品感兴趣,请告诉我。(我没有网站)UOS:我不认为你在回答他的问题或者帮助他解决问题……马珂——如果他可以考虑打包解决方案的话。人们在适当的地方提供jQuery、Telerik等。他可能不感兴趣,但这就是为什么我没有将其作为答案发布。用多种方法分解代码以使其更具可读性。@WraitNath:我的想法是计算整数天数(这就是为什么天数被声明并转换为int),因此如果date2是第1天之后的一天,则天数应为0或1,具体取决于hour1大于hour2。我要检查一下…@WraitNath:好的,再试一次。我现在不能写代码,但是试试这个。对于date1和date2之间的每一天,您必须检查以下内容:如果开始时间小于工作开始时间,则开始时间=工作开始时间;如果结束时间大于工作结束时间,则结束时间=工作结束时间。因此,对于每一天,您可以求和总小时数并增加总天数。我尝试在不使用VS的情况下使用代码,所以请原谅一些错误,只使用“逻辑”。@WraitNath:注意,我的代码只使用小时,但您可能也应该检查分钟数…@WraithNath:我发布和编辑的代码不适合您?@WraithNath:记住,正如我在之前的评论中告诉您的,我只使用小时,但是,把逻辑和分钟一起使用。。。
/// <summary>
        /// Calculates the number of working days for a specified day
        /// </summary>
        /// <param name="dtHolidayStartTime">The start time of the holiday request</param>
        /// <param name="dtHolidayEndTime">The end time of the holiday request</param>
        /// <param name="dtCurrentDay">The current day being evaluated</param>
        /// <param name="lWorkingDayRules">The current set of working day rules</param>
        /// <param name="dTotalDays">A reference to the total days on the request</param>
        [VersionChange( "7.3.88.271", "10/04/2011", "Method added to calculate No days on a request" )]
        private void CalculateWorkingDays( ref DateTime dtHolidayStartTime, ref DateTime dtHolidayEndTime, DateTime dtCurrentDay, List<UserTimeRule> lWorkingDayRules, ref double dTotalDays )
        {
            try
            {
                //Check whether Holiday start time is before the start time of the working day
                if ( dtHolidayStartTime.TimeOfDay < lWorkingDayRules[ 0 ].StartTime.TimeOfDay )
                {
                    dtHolidayStartTime = new DateTime(
                        dtHolidayStartTime.Year,
                        dtHolidayStartTime.Month,
                        dtHolidayStartTime.Day,
                        lWorkingDayRules[ 0 ].StartTime.Hour,
                        lWorkingDayRules[ 0 ].StartTime.Minute,
                        lWorkingDayRules[ 0 ].StartTime.Minute );
                }
                //Check whether the holiday end time is after the end time of a nomal working day
                if ( dtHolidayEndTime.TimeOfDay > lWorkingDayRules[ 0 ].EndTime.TimeOfDay )
                {
                    dtHolidayEndTime = new DateTime(
                        dtHolidayEndTime.Year,
                        dtHolidayEndTime.Month,
                        dtHolidayEndTime.Day,
                        lWorkingDayRules[ 0 ].EndTime.Hour,
                        lWorkingDayRules[ 0 ].EndTime.Minute,
                        lWorkingDayRules[ 0 ].EndTime.Minute );
                }
                //Check whether the holiday end time is after lunch time, but before the end of the day
                if ( dtHolidayEndTime.TimeOfDay > lWorkingDayRules[ 0 ].LunchEndTime.TimeOfDay
                    && dtHolidayEndTime.TimeOfDay < lWorkingDayRules[ 0 ].EndTime.TimeOfDay )
                {
                    dtHolidayEndTime = new DateTime(
                        dtHolidayEndTime.Year,
                        dtHolidayEndTime.Month,
                        dtHolidayEndTime.Day,
                        lWorkingDayRules[ 0 ].LunchEndTime.Hour,
                        lWorkingDayRules[ 0 ].LunchEndTime.Minute,
                        lWorkingDayRules[ 0 ].LunchEndTime.Minute );
                }

                //Create a date time object for the end current working day
                DateTime dtWorkingDayEndTime = new DateTime(
                    dtCurrentDay.Year,
                    dtCurrentDay.Month,
                    dtCurrentDay.Day,
                    lWorkingDayRules[ 0 ].EndTime.Hour,
                    lWorkingDayRules[ 0 ].EndTime.Minute,
                    lWorkingDayRules[ 0 ].EndTime.Second );

                //Create a date time object for the end of lunch
                DateTime dtWorkingDayLunchTime = new DateTime(
                    dtCurrentDay.Year,
                    dtCurrentDay.Month,
                    dtCurrentDay.Day,
                    lWorkingDayRules[ 0 ].LunchEndTime.Hour,
                    lWorkingDayRules[ 0 ].LunchEndTime.Minute,
                    lWorkingDayRules[ 0 ].LunchEndTime.Second );

                //Create a date time object for the start of the current day
                DateTime dtWorkingDayStartTime = new DateTime(
                    dtCurrentDay.Year,
                    dtCurrentDay.Month,
                    dtCurrentDay.Day,
                    lWorkingDayRules[ 0 ].StartTime.Hour,
                    lWorkingDayRules[ 0 ].StartTime.Minute,
                    lWorkingDayRules[ 0 ].StartTime.Second );

                //Check whether to add the first half of the day
                if ( dtHolidayEndTime >= dtWorkingDayLunchTime )
                {
                    dTotalDays += 0.5f;
                }

                //Check whether to add the second half of the day
                if ( dtHolidayEndTime >= dtWorkingDayEndTime )
                {
                    dTotalDays += 0.5f;
                }
            }
            catch ( Exception )
            {
                throw;
            }
        }
int htot = 0, dtot = 0;
while (date2>date1) {
  int h1 = date1.Hour < work_start ? work_start : date1.Hour;
  int h2 = date1.Hour > work_end ? work_end : date1.Hour;
  htot += (h2-h1);
  dtot++;
  date1 = date1.AddDays(1);
}