Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何查找日期范围之间的匹配时间_C#_.net_Date_Datetime_.net Core - Fatal编程技术网

C# 如何查找日期范围之间的匹配时间

C# 如何查找日期范围之间的匹配时间,c#,.net,date,datetime,.net-core,C#,.net,Date,Datetime,.net Core,我正在做一个约会查找程序,它可以查看人们的日历并搜索会议的可用时间。它工作得很好。但是,我想排除对中断时间的查找,这是一个介于两个日期时间之间的日期范围,这两个日期时间都以1/1/1作为年份(作为占位符),并包含其后面的时间。我正在迭代一个工作日的每一分钟,一个函数应该确定当前时间是否在休息时间日期范围内 我有一个自定义日期范围类的列表: private static List<DateRange> _breakTimes = new List<DateRange>()

我正在做一个约会查找程序,它可以查看人们的日历并搜索会议的可用时间。它工作得很好。但是,我想排除对中断时间的查找,这是一个介于两个日期时间之间的日期范围,这两个日期时间都以1/1/1作为年份(作为占位符),并包含其后面的时间。我正在迭代一个工作日的每一分钟,一个函数应该确定当前时间是否在休息时间日期范围内

我有一个自定义日期范围类的列表:

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;
                            }
                        }