C# 从timespan计算夜间总时间
假设夜间时间设置为20.30小时至6.15小时(上午)。这两个参数是用户范围的变量。 假设您有一个到达日期和一个离开日期,可以跨越几分钟到一天以上。 你如何计算夜间的总小时数C# 从timespan计算夜间总时间,c#,.net,winforms,datetime,timespan,C#,.net,Winforms,Datetime,Timespan,假设夜间时间设置为20.30小时至6.15小时(上午)。这两个参数是用户范围的变量。 假设您有一个到达日期和一个离开日期,可以跨越几分钟到一天以上。 你如何计算夜间的总小时数 public static double CalculateTotalNightTimeHours(DateTime arrival, DateTime departure,
public static double CalculateTotalNightTimeHours(DateTime arrival,
DateTime departure,
int nightTimeStartHour,
int nightTimeStartMinute,
int nightTimeEndHour,
int nightTimeEndMinute)
{
//??
}
编辑:我知道这可能不是直接的是/否答案,但可能有人有一个优雅的解决方案来解决这个问题。
回答这些评论:我确实想计算用户可编辑的夜间开始时间和结束时间之间的总小时数(或分钟数)。我在计算访问时间,第一个日期实际上是到达参数
到目前为止,我的代码是:
DateTime nightStart = new DateTime( departure.Year, departure.Month, departure.Day,
nightTimeStartHour, nightTimeStartMinute, 0);
DateTime nightEnd = new DateTime( arrival.Year, arrival.Month, arrival.Day,
nightTimeEndHour, nightTimeEndMinute, 0);
if (arrival < nightEnd)
{
decimal totalHoursNight = (decimal)nightEnd.Subtract(arrival).TotalHours;
}
//...
DateTime nightStart=新的日期时间(出发.年,出发.月,出发.日,
nightTimeStartHour,nightTimeStartMinute,0);
DateTime nightEnd=新的日期时间(到达。年,到达。月,到达。日,
nightTimeEndHour,nightTimeEndMinute,0);
如果(到达<夜间结束)
{
decimal totalHoursNight=(十进制)nightEnd.Subtract(arrival.TotalHours);
}
//...
仅仅因为我准备接受挑战,您就应该能够成功地使用以下功能。请注意,这可能不是最有效的方法,但我是这样做的,所以我可以列出逻辑。我可能会决定编辑它作为改进它的一点,但它应该可以正常工作
注意以下几个假设也很重要:
public static double Calc(DateTime start, DateTime end, int startHour, int startMin, int endHour, int endMin)
{
if (start > end)
throw new Exception();//or whatever you want to do
//create timespans for night hours
TimeSpan nightStart = new TimeSpan(startHour, startMin, 0);
TimeSpan nightEnd = new TimeSpan(endHour, endMin, 0);
//check to see if any overlapping actually happens
if (start.Date == end.Date && start.TimeOfDay >= nightEnd && end.TimeOfDay <= nightStart)
{
//no overlapping occurs so return 0
return 0;
}
//check if same day as will process this differently
if (start.Date == end.Date)
{
if (start.TimeOfDay > nightStart || end.TimeOfDay < nightEnd)
{
return (end - start).TotalHours;
}
double total = 0;
if (start.TimeOfDay < nightEnd)
{
total += (nightEnd - start.TimeOfDay).TotalHours;
}
if(end.TimeOfDay > nightStart)
{
total += (end.TimeOfDay - nightStart).TotalHours;
}
return total;
}
else//spans multiple days
{
double total = 0;
//add up first day
if (start.TimeOfDay < nightEnd)
{
total += (nightEnd - start.TimeOfDay).TotalHours;
}
if (start.TimeOfDay < nightStart)
{
total += ((new TimeSpan(24, 0, 0)) - nightStart).TotalHours;
}
else
{
total += ((new TimeSpan(24, 0, 0)) - start.TimeOfDay).TotalHours;
}
//add up the last day
if (end.TimeOfDay > nightStart)
{
total += (end.TimeOfDay - nightStart).TotalHours;
}
if (end.TimeOfDay > nightEnd)
{
total += nightEnd.TotalHours;
}
else
{
total += end.TimeOfDay.TotalHours;
}
//add up any full days
int numberOfFullDays = (end - start).Days;
if (end.TimeOfDay > start.TimeOfDay)
{
numberOfFullDays--;
}
if (numberOfFullDays > 0)
{
double hoursInFullDay = ((new TimeSpan(24, 0, 0)) - nightStart).TotalHours + nightEnd.TotalHours;
total += hoursInFullDay * numberOfFullDays;
}
return total;
}
}
基本上,你们需要计算夜晚的开始和结束时间。然后将这些数据与到达和离开日期进行比较,查看您是在夜间开始后到达还是在夜间结束前离开,以获得需要减去的值,从而确定夜间总小时数。然后,您需要每天继续计算该值,直到晚上的开始时间超过出发日期。这是我的解决方案
public static double CalculateTotalNightTimeHours(
DateTime arrival,
DateTime departure,
int nightTimeStartHour,
int nightTimeStartMinute,
int nightTimeEndHour,
int nightTimeEndMinute)
{
if (arrival >= departure)
return 0;
var nightStart = arrival.Date.AddHours(nightTimeStartHour).AddMinutes(nightTimeStartMinute);
var nightEnd = nightStart.Date.AddDays(1).AddHours(nightTimeEndHour).AddMinutes(nightTimeEndMinute);
double nightHours = 0;
while (departure > nightStart)
{
if (nightStart < arrival)
nightStart = arrival;
if (departure < nightEnd)
nightEnd = departure;
nightHours += (nightEnd - nightStart).TotalHours;
nightStart = nightStart.Date.AddDays(1).AddHours(nightTimeStartHour).AddMinutes(nightTimeStartMinute);
nightEnd = nightStart.Date.AddDays(1).AddHours(nightTimeEndHour).AddMinutes(nightTimeEndMinute);
}
return nightHours;
}
公共静态双重计算总计夜间小时数(
到达日期时间,
日期时间出发,
int夜间开始时间,
int NightTimesStartMinute,
int nightTimeEndHour,
int nightTimeEndMinute)
{
如果(到达>=离开)
返回0;
var nightStart=arrival.Date.AddHours(nightTimeStartHour).AddMinutes(NightTimeStartMinutes);
var nightEnd=nightStart.Date.AddDays(1).AddHours(nightTimeEndHour).AddMinutes(NightTimeEndMinutes);
双倍夜间=0;
中途(出发>夜间开始)
{
if(夜间开始<到达)
夜间开始=到达;
如果(出发<夜间结束)
夜间=出发;
nightHours+=(nightEnd-nightStart)。总小时数;
nightStart=nightStart.Date.AddDays(1).AddHours(nightTimeStartHour).AddMinutes(NightTimeStartMinutes);
nightEnd=nightStart.Date.AddDays(1).AddHours(nightTimeEndHour).AddMinutes(NightTimeEndMinutes);
}
夜间返回;
}
您可能还希望添加检查以确保开始和结束时间在范围内。这还假设夜晚从一天开始,到下一天结束,所以如果你想在午夜之前结束夜晚,你必须做些别的事情。那么你想知道他们的旅行时间有多少是在夜间完成的?这似乎是一个相当琐碎(可能有点乏味)的问题,除非你有更具体的问题或有代码表明你已经尝试过,否则没有多少人愿意为你做什么。哪一次是第一次约会?到达还是离开?i、 e.你是在计算旅行时间还是访问时间?这说明了一些问题:)@RunCMD看到夏令时了吗?@Alan这不处理夏令时。谢谢你的回答。我接受了另一个答案,因为它是最先发布的。重叠测试可以简化为:
start.Date==end.Date&&start.TimeOfDay>=nightEnd&&end.TimeOfDay
public static double CalculateTotalNightTimeHours(
DateTime arrival,
DateTime departure,
int nightTimeStartHour,
int nightTimeStartMinute,
int nightTimeEndHour,
int nightTimeEndMinute)
{
if (arrival >= departure)
return 0;
var nightStart = arrival.Date.AddHours(nightTimeStartHour).AddMinutes(nightTimeStartMinute);
var nightEnd = nightStart.Date.AddDays(1).AddHours(nightTimeEndHour).AddMinutes(nightTimeEndMinute);
double nightHours = 0;
while (departure > nightStart)
{
if (nightStart < arrival)
nightStart = arrival;
if (departure < nightEnd)
nightEnd = departure;
nightHours += (nightEnd - nightStart).TotalHours;
nightStart = nightStart.Date.AddDays(1).AddHours(nightTimeStartHour).AddMinutes(nightTimeStartMinute);
nightEnd = nightStart.Date.AddDays(1).AddHours(nightTimeEndHour).AddMinutes(nightTimeEndMinute);
}
return nightHours;
}