如何知道2个DateTimes是否介于其他2个DateTimes C#之间

时间:2017-07-01 15:16:01

标签: c# datetime

例如: 2我要检查的日期: 入住时间:2017年5月19日 退房时间:05/26/2017

我要验证其他日期是否在以下日期: 入住时间:05/20/2017 退房时间:05/25/2017

在这种情况下,会有一段时间介于两者之间但是如何将其放入代码?

我试过了:

if ((dt >= checkin2 && dt <= checkou2) || (dt2 >= checkin2 && dt2 <=
checkout2))
{
    check = true;
}

5 个答案:

答案 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; 替换为<