例如: 2我要检查的日期: 入住时间:2017年5月19日 退房时间:05/26/2017
我要验证其他日期是否在以下日期: 入住时间:05/20/2017 退房时间:05/25/2017
在这种情况下,会有一段时间介于两者之间但是如何将其放入代码?
我试过了:
if ((dt >= checkin2 && dt <= checkou2) || (dt2 >= checkin2 && dt2 <=
checkout2))
{
check = true;
}
答案 0 :(得分:1)
如果您要问的是“期间A是否完全包含在期间B之间”,那么您可以使用:
public static class SystemDateTimeExtensions
{
/// <summary>
/// Defines a period of time by setting two date times
/// </summary>
public class Period
{
public DateTime Start { get; set; }
public DateTime End { get; set; }
}
/// <summary>
/// Checks that a period of time is completely contained within another period of time.
/// </summary>
/// <param name="value"></param>
/// <param name="encapsulator"></param>
/// <returns></returns>
public static bool IsEnclosedByPeriod(this Period value, Period encapsulator)
{
//if the start of the smaller value is before or after the encapsulator, then we're not completely inside it.
if (value.Start < encapsulator.Start || value.Start > encapsulator.End)
return false;
//if the end of the smaller value is before or after the encapsulator, then we're not completely inside it.
if (value.End < encapsulator.Start || value.End > encapsulator.End)
return false;
//then we're fully inside!
return true;
}
}
免责声明:我没有对此进行测试。
答案 1 :(得分:1)
如果您想知道两个时段是否重叠,您可以进行以下测试(假设DateTime
值仅包含日期但没有时间,即它们代表一整天):
bool overlaps = checkIn2 <= checkOut1 && checkOut2 >= checkIn1;
目视
checkIn2 <= checkOut1:
checkIn1 checkOut1
+-------------------------+
checkIn2 checkOut2
+-----------------------+
和
checkOut2 >= checkIn1:
checkIn1 checkOut1
+-------------------------+
checkIn2 checkOut2
+-----------------------+
如果您的DateTime
值包含日期和时间,即它们代表一个时间点,我会检查:
bool overlaps = checkIn2 < checkOut1 && checkOut2 > checkIn1;
答案 2 :(得分:0)
您应该以这种方式使用DateTime.CompareTo
方法:
if(dt.CompareTo(checkin2)>=0 && dt.CompareTo(checkout2)<=0 && dt.CompareTo(dt1)<0)
{
check = true;
}
答案 3 :(得分:0)
您可以将日期string
值转换为DateTime
个对象:
string format = "MM/dd/yyyy";
CultureInfo provider = CultureInfo.InvariantCulture;
DateTime dateA = DateTime.ParseExact("05/19/2017", format, provider);
DateTime dateB = DateTime.ParseExact("05/26/2017", format, provider);
然后将它们比作:
if(dateA < dateB)
{
// dateA is earlier than dateB
}
答案 4 :(得分:0)
简单。
public static bool IsMyDateTimeBetweenOther(DateTime my1, DateTime my2, DateTime other1, DateTime other2)
{
var dl = new [] { my1, my2, other1, other2 };
Array.Sort(dl);
return dl[1] == my1 && dl[2] == my2 || dl[1] == my2 && dl[2] == my1;
}
所以,基本的是,如果你的DateTimes在其他人之间,他们必须在调用Sort()
之后处于位置[1]和位置[2],无论你是按升序还是降序输入它们。
此方法的优点是,根据4个输入日期时间的排序顺序,您可以通过检查它们在排序数组中的位置来确定所有6个结果(假设my1
&lt; my2
,{{ 1}}&LT; o1
):
my1,my2,o1,o2
o1,my1,my2,o2
o1,o2,my1,my2
my1,o1,my2,o2
o1,my1,o2,my2
my1,o1,o2,my2
您必须注意的唯一一点是,o2
时,该方法将返回my1==my1==o1==o2
。如果此行为不符合您的要求,您必须根据需要进行额外检查。
当然,如果您简单地需要介于两者之间,那么以下工具应该是最有效的:
true
此外,您可以根据需要将public static bool IsMyDateTimeBetweenOther(DateTime my1, DateTime my2, DateTime other1, DateTime other2)
=> other1 < other2
? other1 < my1 && other1 < my2 && my1 < other2 && my2 < other2
: other2 < my1 && other2 < my2 && my1 < other1 && my2 < other1;
替换为<
。