C# 如何查找日期范围之间的匹配时间
我正在做一个约会查找程序,它可以查看人们的日历并搜索会议的可用时间。它工作得很好。但是,我想排除对中断时间的查找,这是一个介于两个日期时间之间的日期范围,这两个日期时间都以1/1/1作为年份(作为占位符),并包含其后面的时间。我正在迭代一个工作日的每一分钟,一个函数应该确定当前时间是否在休息时间日期范围内 我有一个自定义日期范围类的列表:C# 如何查找日期范围之间的匹配时间,c#,.net,date,datetime,.net-core,C#,.net,Date,Datetime,.net Core,我正在做一个约会查找程序,它可以查看人们的日历并搜索会议的可用时间。它工作得很好。但是,我想排除对中断时间的查找,这是一个介于两个日期时间之间的日期范围,这两个日期时间都以1/1/1作为年份(作为占位符),并包含其后面的时间。我正在迭代一个工作日的每一分钟,一个函数应该确定当前时间是否在休息时间日期范围内 我有一个自定义日期范围类的列表: private static List<DateRange> _breakTimes = new List<DateRange>()
private static List<DateRange> _breakTimes = new List<DateRange>() {
new DateRange(new DateTime(1, 1, 1, 10, 0, 0), new DateTime(1, 1, 1, 10, 30, 0)),
new DateRange(new DateTime(1, 1, 1, 13, 30, 0), new DateTime(1, 1, 1, 14, 0, 0))
};
private static List\u breakTimes=new List(){
新日期范围(新日期时间(1,1,1,10,0,0),新日期时间(1,1,1,10,30,0)),
新的日期范围(新的日期时间(1,1,1,13,30,0),新的日期时间(1,1,1,14,0,0))
};
这是一个遍历所有工作日的函数(我已经注释了check函数应该去的那一行):
foreach(在GetWorkingDays中的var日期(开始日期、结束日期))
{
for(int hour=0;hour=endingHour)continue;
对于(int-minute=0;minute<60;minute++)
{
var currentDate=新的日期时间(日期.年,日期.月,日期.日,小时,分钟,0);
bool shouldContinue=false;
foreach(var中断时间,单位为中断时间)
{
//此处应查看当前时间是否在中断时间内:
如果((currentDate.Hour>=breakTime.StartDate.Hour&¤tDate.Hour breakTime.StartDate.Minute&¤tDate.Minute)我使用带元组的列表解决了这个问题,并分别添加分钟:
private static List<Tuple<TimeSpan, int>> _breakTimes = new List<Tuple<TimeSpan, int>>()
{
new Tuple<TimeSpan, int>(new TimeSpan(10, 0, 0), 30),
new Tuple<TimeSpan, int>(new TimeSpan(13, 30, 0), 30)
};
private static List\u breakTimes=new List()
{
新元组(新时间跨度(10,0,0,30),
新元组(新时间跨度(13,30,0,30)
};
这是查看是否为休息时间的函数:
foreach (var breakTime in _breakTimes)
{
if (currentTime >= breakTime.Item1 && currentTime < breakTime.Item1.Add(new TimeSpan(0, breakTime.Item2, 0)))
{
shouldContinue = true;
break;
}
}
foreach(变量中断时间,单位为中断时间)
{
如果(currentTime>=breakTime.Item1&¤tTime
您可以修改本示例中的代码以获得所需的内容
foreach(新[]{DateTime.Now}中的var date)
{
for(int hour=0;hour=endingHour)continue;
对于(int-minute=0;minute<60;minute++)
{
var currentDate=新的日期时间(日期.年,日期.月,日期.日,小时,分钟,0);
bool shouldContinue=false;
var currentTime=新的日期时间(1,1,1,hour,minute,0);
foreach(var中断时间,单位为中断时间)
{
var isInBreak=breakTime.StartDate如果你也将breakTime分解为分钟,你可以填充一个hashset并检查日期是否包含在hashset中。另外,如果你将时间分解为分钟。只需在两个集合上调用IntersectWith,你就会知道它们是否重叠。@Jason我不想将每分钟都添加到列表中这就是为什么我使用DateRange和DateTimes。或者你的意思是其他的吗?我的建议是用linqs SelectMany将中断时间平铺成一个以分钟为单位的哈希集,是的,你使用了一些内存,就像列表一样,但是在检查每分钟的间隔是否为常数时,你的查找时间不是线性的。你能提供一些代码或示例吗,p租赁?我从未使用过哈希集或扩展Linq。谢谢:)你认为你的解决方案比我的好吗?还是我应该保持我的解决方案?我想说这个答案可能是最可读的。TimeSpan是一个用来表示时间段的类,而不是一天中的时间。我会创建一个自定义类或命名元组以避免使用Item1等。但是你可以将答案修改为类,该类将datetime和timespan作为两个datetime的替代方案,并使其具有同样的可读性。好的。我可以创建一个自定义类,因为我使用的C#版本不支持命名元组。再次感谢您的帮助:)
foreach (var breakTime in _breakTimes)
{
if (currentTime >= breakTime.Item1 && currentTime < breakTime.Item1.Add(new TimeSpan(0, breakTime.Item2, 0)))
{
shouldContinue = true;
break;
}
}