C# 从日期列表中获取时间间隔范围
我当前希望从日期列表中获取日期范围(时间范围之间) 例如: 现在是时候了 2017-04-08 18:00 我从日期和日期得到了这些:C# 从日期列表中获取时间间隔范围,c#,asp.net,C#,Asp.net,我当前希望从日期列表中获取日期范围(时间范围之间) 例如: 现在是时候了 2017-04-08 18:00 我从日期和日期得到了这些: public static string[] fromDates = new string[] { "2017-04-07 07:00", "2017-04-07 10:00", "2017-04-07 12:00", "2017-04-07 14:00", "2017-04-07 16:00" }; public static string[] toDates
public static string[] fromDates = new string[] { "2017-04-07 07:00", "2017-04-07 10:00", "2017-04-07 12:00", "2017-04-07 14:00", "2017-04-07 16:00" };
public static string[] toDates = new string[] { "2017-04-07 08:00", "2017-04-07 11:00", "2017-04-07 13:00", "2017-04-07 15:00", "2017-04-07 17:00" };
我正在使用以下代码:
public static bool IsInRange(this DateTime dateToCheck, string[] startDates, string[] endDates, out string StartDate, out string EndDate)
{
DateTime startDate = new DateTime();
DateTime endDate = new DateTime();
bool isWithinRange = false;
for (int i = 0; i < startDates.Length; i++)
{
startDate = Convert.ToDateTime(startDates[i]);
isWithinRange = dateToCheck >= startDate;
if (isWithinRange)
break;
}
for (int y = 0; y < endDates.Length; y++)
{
endDate = Convert.ToDateTime(endDates[y]);
isWithinRange = dateToCheck < endDate;
if (isWithinRange)
break;
}
StartDate = startDate;
EndDate = endDate;
return isWithinRange;
}
但是我无法让它工作,在IsInRange
方法中的StartDate
总是返回true,它将从fromDates
变量返回第一个索引,这是错误的
我怎样才能让这段时间像是在两人之间
我知道我可以这样做:
var isBetween = Convert.ToDateTime("2017-04-08 18:00").IsInRange(fromDates, toDates, out StartDate, out EndDate)
var isBetween = dateToCheck >= startDate && dateToCheck < endDate
public DateTimeRange FindRange(IEnumerable<DateTimeRange> ranges, DateTime value) =>
ranges.FirstOrDefault(range => range.Contains(value));
var isBetween=dateToCheck>=startDate&&dateToCheck
但这只是一个日期需要检查,如果它是像我的情况呢
非常感谢你的回答
谢谢我将首先将所有内容转换为更有用的对象模型:
- 去掉所有字符串(即,从字符串转换为早期更有用的字符串)
- 不要有两个集合,而是创建一个指示“日期/时间范围”的新类型。将错误的项目关联在一起会使您有些挫败:开始值彼此无关,它们与相应的结束日期相关
public sealed class DateTimeRange
{
public DateTime Start { get; }
public DateTime End { get; }
public DateTimeRange(DateTime start, DateTime end)
{
// TODO: Validate that start <= end
Start = start;
End = end;
}
public bool Contains(DateTime value) => Start <= value && value < End;
}
公共密封类日期时间范围
{
公共日期时间开始{get;}
公共日期时间结束{get;}
公共日期时间范围(日期时间开始、日期时间结束)
{
//TODO:验证该开始
ranges.FirstOrDefault(range=>range.Contains(value));
如果没有范围包含值,则返回null
,否则返回第一个包含值的范围
(顺便说一句,我想把所有这些都作为一个更好的日期/时间API来做,但我有偏见。)我会首先将所有内容转换成一个更有用的对象模型:
- 去掉所有字符串(即,从字符串转换为早期更有用的字符串)
- 不要有两个集合,而是创建一个指示“日期/时间范围”的新类型。通过将错误的项关联在一起,您会遇到一些困难:开始值彼此不相关,它们与相应的结束日期相关
public sealed class DateTimeRange
{
public DateTime Start { get; }
public DateTime End { get; }
public DateTimeRange(DateTime start, DateTime end)
{
// TODO: Validate that start <= end
Start = start;
End = end;
}
public bool Contains(DateTime value) => Start <= value && value < End;
}
公共密封类日期时间范围
{
公共日期时间开始{get;}
公共日期时间结束{get;}
公共日期时间范围(日期时间开始、日期时间结束)
{
//TODO:验证该开始
ranges.FirstOrDefault(range=>range.Contains(value));
如果没有范围包含值,则返回null
,否则返回第一个包含值的范围
(顺便说一句,我想把所有这些都作为一个更好的日期/时间API来做,但我有偏见。)如果你想继续使用yoir设计,那么你应该在一个循环内做所有事情,而不是做两次,因为你总是想将第一个元素与第一个元素匹配,第二个与第二个元素匹配,等等
public static bool IsInRange(this DateTime dateToCheck, string[] startDates, string[] endDates, out DateTime StartDate, out DateTime EndDate)
{
if (startDates.Length != endDates.Length)
{
throw new ArgumentException("The arrays must have the same length");
}
StartDate = new DateTime();
EndDate = new DateTime();
for (int i = 0; i < startDates.Length; i++)
{
StartDate = Convert.ToDateTime(startDates[i]);
EndDate = Convert.ToDateTime(endDates[i]);
if (dateToCheck >= StartDate && dateToCheck <= EndDate)
{
return true;
}
}
return false;
}
public static bool IsInRange(此DateTime dateToCheck,字符串[]StartDate,字符串[]endDates,out DateTime StartDate,out DateTime EndDate)
{
if(startDates.Length!=endDates.Length)
{
抛出新ArgumentException(“数组必须具有相同的长度”);
}
StartDate=新的日期时间();
EndDate=新的日期时间();
对于(int i=0;i 如果(dateToCheck>=StartDate&&dateToCheck如果您想继续使用yoir设计,那么您应该在一个循环中完成所有操作,而不是重复两次,因为您希望始终将第一个元素与第一个元素匹配,第二个与第二个元素匹配,等等
public static bool IsInRange(this DateTime dateToCheck, string[] startDates, string[] endDates, out DateTime StartDate, out DateTime EndDate)
{
if (startDates.Length != endDates.Length)
{
throw new ArgumentException("The arrays must have the same length");
}
StartDate = new DateTime();
EndDate = new DateTime();
for (int i = 0; i < startDates.Length; i++)
{
StartDate = Convert.ToDateTime(startDates[i]);
EndDate = Convert.ToDateTime(endDates[i]);
if (dateToCheck >= StartDate && dateToCheck <= EndDate)
{
return true;
}
}
return false;
}
public static bool IsInRange(此DateTime dateToCheck,字符串[]StartDate,字符串[]endDates,out DateTime StartDate,out DateTime EndDate)
{
if(startDates.Length!=endDates.Length)
{
抛出新ArgumentException(“数组必须具有相同的长度”);
}
StartDate=新的日期时间();
EndDate=新的日期时间();
对于(int i=0;i 如果(dateToCheck>=StartDate&&dateToCheck我正要发布这些准确的更改:)感谢您的回答和建议@Pawel Gradecki,我想接受您的两个答案,但它们(stackoverflow)不允许我这样做:)。将尝试Jon Skeet的建议和您的建议,重新设计我的代码。请注意,代码目前不会编译,return
语句需要在循环之后。我建议您根本不需要isWithinRange
,只需返回true
,而不是break
语句,>return false
如果你到达循环的末尾。@JonSkeet yes我在修复格式时弄错了一些东西:/显然,循环后必须是return语句。我现在修复了代码。我正要发布这些精确的更改:)谢谢你的回答和建议@Pawel Gradecki,我想接受你的两个答案,但它们都是错误的are(堆栈溢出)不允许我这样做:)。将尝试Jon Skeet的建议和你关于重新设计我的代码的建议。请注意,代码目前不会编译,return
语句需要在循环之后。我建议你根本不需要isWithinRange
,你只需返回true
,而不是break代码>语句和