验证以确保日期不会落在现有日期之间或与现有日期重叠

时间:2012-04-23 12:00:35

标签: c# validation datetime

基本上我有一个有效且有效的报价。

例如:01/02/2012至03/02/2012

当我添加新优惠时,我需要有效确保此优惠不属于上述现有优惠或与之重叠。

我目前的代码如下:

// Obtain the current list of coupons associated to the retailer.
List<RetailerCoupon> retailerCoupons = PayPalInStore.Data.RetailerCoupon.Find(x => x.RetailerId == RetailerId).ToList();

// Loop through each coupon and see if the timeframe provided in the NEW coupon doesnt fall between any EZISTING coupon.
if (retailerCoupons != null)
{
    foreach (RetailerCoupon coupon in retailerCoupons)
    {
        DateTime retailerCouponValidFrom = coupon.DateValidFrom;
        DateTime retailerCouponValidTo = coupon.DateExpires;

        if (DateTime.Compare(retailerCouponValidFrom, ValidFrom) < 0 && DateTime.Compare(retailerCouponValidTo, ValidTo) > 0)
        {
            return true;
        }

        if (retailerCouponValidFrom == ValidFrom && retailerCouponValidTo == ValidTo.AddHours(23).AddMinutes(59).AddSeconds(59))
        {
            return true;
        }
    }
}

return result;

虽然这不起作用,但有人可以帮我这个吗?

4 个答案:

答案 0 :(得分:0)

在您确定开始日期和结束日期是包含还是排除之后,检测重叠的常用方法是比较正在考虑的两个范围的相反的端。

您需要在范围2 结束之前询问“范围1 开始吗?”和“范围1 <范围2 开始 <范围1 < EM>端?”。如果这两个问题都得到肯定回答,那么你就会有重叠。

我目前的代码中并不清楚结尾是包含还是排他,所以我不会尝试发布实际代码。

答案 1 :(得分:0)

1)我认为retailerCoupons不能为空。

2)为什么使用DateTime.Compare(t1, t2) < 0时可以编写更易读的t1 <= t2

3)如果要测试两个间隔是否重叠,请测试以下内容:

bool they_do_not_overlap = t1_end <= t2_start || t1_start >= t2_end;

答案 2 :(得分:0)

不能直接回答您的问题,但有机会谈论我最喜欢的一个库:TimePeriod for .NET。阅读这篇文章会给你一些关于如何处理你的情况的提示。

答案 3 :(得分:0)

怎么样,使用linq

var overlaps=retailerCoupons.Any(c=> c.DateValidFrom <= ValidTo && c.DateExpires >= ValidFrom);

然后

result= !overlaps;