C# 查找特定时间范围内的时间发生和持续时间
我在C#做了一个小小的停车申请。根据车辆类型和时区,有一些不同的价格。一天可以分为时区(例如上午、白天、晚上和晚上)。现在,若客户停止停车,我想计算客户在哪个时区停车以及停车时间 例如,早上时区从6:00开始到12:00结束,白天时区从12:00开始到16:00结束,晚上时区从16:00开始到23:00结束,晚上时区从23:00开始到6:00结束。客户在00:30开始停车,6:32结束停车。目前我有4个变量:停车开始时间、停车结束时间、时区开始时间和时区结束时间 第二个例子是客户24小时停车,那么停车时间涵盖了所有时区 如何最简单地计算客户在不同时区停车的时间和分钟数 问候,, 邪恶的 编辑: 从MSDN获得了这个答案,并将其发布在这里,以便其他人也可以从中学习C# 查找特定时间范围内的时间发生和持续时间,c#,datetime,time,range,C#,Datetime,Time,Range,我在C#做了一个小小的停车申请。根据车辆类型和时区,有一些不同的价格。一天可以分为时区(例如上午、白天、晚上和晚上)。现在,若客户停止停车,我想计算客户在哪个时区停车以及停车时间 例如,早上时区从6:00开始到12:00结束,白天时区从12:00开始到16:00结束,晚上时区从16:00开始到23:00结束,晚上时区从23:00开始到6:00结束。客户在00:30开始停车,6:32结束停车。目前我有4个变量:停车开始时间、停车结束时间、时区开始时间和时区结束时间 第二个例子是客户24小时停车,那
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
DateTime start = new DateTime(2011, 7, 25, 0, 30, 0);
DateTime end = new DateTime(2011, 7, 26, 6, 32, 0);
List<DateTime> listTimeZones = CalculateTotalTime(start, end);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < listTimeZones.Count; i++)
{
sb.AppendLine(String.Format("{0}. {1}: from {2} to {3}",
i + 1,
GetZoneInWords(listTimeZones[i].Hour),
String.Format("{0:dd.MM.yyyy hh:mm}", listTimeZones[i]),
(i + 1) < listTimeZones.Count
? String.Format("{0:dd.MM.yyyy hh:mm}", listTimeZones[i + 1])
: "Parking ended"));
}
MessageBox.Show(sb.ToString());
}
private List<DateTime> CalculateTotalTime(DateTime start, DateTime end)
{
DateTime temp = start;
int hour = start.Hour;
int minute = start.Minute;
int morning = 6;
int day = 12;
int evening = 17;
int night = 23;
List<DateTime> timeZones = new List<DateTime>();
do
{
temp = temp.AddHours(1);
if (temp.Hour == morning || temp.Hour == day ||
temp.Hour == evening || temp.Hour == night)
{
timeZones.Add(temp);
}
} while (temp < end);
return timeZones;
}
private string GetZoneInWords(int time)
{
string timeOfDay = "";
if (time.Equals(6))
timeOfDay = "Morning";
else if (time.Equals(12))
timeOfDay = "Day";
else if (time.Equals(17))
timeOfDay = "Evening";
else if (time.Equals(23))
timeOfDay = "Night";
return timeOfDay + " parking";
}
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
日期时间开始=新的日期时间(2011,7,25,0,30,0);
DateTime end=新的日期时间(2011,7,26,6,32,0);
列表时区=CalculateTotalTime(开始、结束);
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
遍历所有“时区”,并计算出每个“时区”与客户停车之间的重叠。例如,作为伪代码:
private static TimeSpan FindOverlap(ParkingTime parkingTime, TimeZone timeZone)
{
// Handle wraparound zones like 23-6. Note that this doesn't attempt
// to handle *parking* which starts at 11.30pm etc.
if (timeZone.Start > timeZone.End)
{
return FindOverlap(parkingTime,
new TimeZone(timeZone.Start.Date, timeZone.End)
+ FindOverlap(parkingTime,
new TimeZone(timeZone.End, timeZone.Start.Date.AddDays(1));
}
DateTime overlapStart = Max(parkingTime.Start, timeZone.Start);
DateTime overlapEnd = Min(parkingTime.End, timeZone.End);
TimeSpan overlap = overlapEnd - overlapStart;
// If the customer arrived after the end or left before the start,
// the overlap will be negative at this point.
return overlap < TimeSpan.Zero ? TimeSpan.Zero : overlap;
}
private static DateTime Min(DateTime x, DateTime y)
{
return x < y ? x : y;
}
private static DateTime Max(DateTime x, DateTime y)
{
return x > y ? x : y;
}
private static TimeSpan FindOverlap(ParkingTime ParkingTime,TimeZone TimeZone)
{
//处理像23-6这样的环绕区域。注意,这不会尝试
//处理晚上11:30开始的*停车*等。
if(timeZone.Start>timeZone.End)
{
返回FindVerLap(驻车时间,
新时区(TimeZone.Start.Date、TimeZone.End)
+FindVerlap(停车时间,
新时区(TimeZone.End、TimeZone.Start.Date.AddDays(1));
}
DateTime overlapStart=Max(parkingTime.Start、timeZone.Start);
DateTime overlapEnd=Min(parkingTime.End,timeZone.End);
TimeSpan重叠=重叠结束-重叠开始;
//如果客户在结束后到达或在开始前离开,
//此时重叠将为负值。
返回重叠y?x:y;
}
顺便说一句,我强烈建议你重新命名你的“时区”概念,因为它已经有了一个众所周知的(如果不是很好理解的话:)含义
也许你应该称之为ParkingInterval
?或者ParkingPriceInterval
,如果差异真的是在成本方面?迭代所有“时区”,并为每个“时区”计算出与客户停车之间的重叠。例如,作为伪代码:
private static TimeSpan FindOverlap(ParkingTime parkingTime, TimeZone timeZone)
{
// Handle wraparound zones like 23-6. Note that this doesn't attempt
// to handle *parking* which starts at 11.30pm etc.
if (timeZone.Start > timeZone.End)
{
return FindOverlap(parkingTime,
new TimeZone(timeZone.Start.Date, timeZone.End)
+ FindOverlap(parkingTime,
new TimeZone(timeZone.End, timeZone.Start.Date.AddDays(1));
}
DateTime overlapStart = Max(parkingTime.Start, timeZone.Start);
DateTime overlapEnd = Min(parkingTime.End, timeZone.End);
TimeSpan overlap = overlapEnd - overlapStart;
// If the customer arrived after the end or left before the start,
// the overlap will be negative at this point.
return overlap < TimeSpan.Zero ? TimeSpan.Zero : overlap;
}
private static DateTime Min(DateTime x, DateTime y)
{
return x < y ? x : y;
}
private static DateTime Max(DateTime x, DateTime y)
{
return x > y ? x : y;
}
private static TimeSpan FindOverlap(ParkingTime ParkingTime,TimeZone TimeZone)
{
//处理像23-6这样的环绕区域。注意,这不会尝试
//处理晚上11:30开始的*停车*等。
if(timeZone.Start>timeZone.End)
{
返回FindVerLap(驻车时间,
新时区(TimeZone.Start.Date、TimeZone.End)
+FindVerlap(停车时间,
新时区(TimeZone.End、TimeZone.Start.Date.AddDays(1));
}
DateTime overlapStart=Max(parkingTime.Start、timeZone.Start);
DateTime overlapEnd=Min(parkingTime.End,timeZone.End);
TimeSpan重叠=重叠结束-重叠开始;
//如果客户在结束后到达或在开始前离开,
//此时重叠将为负值。
返回重叠