当前位置:编程学习 > C#/ASP.NET >>

求高手解决一个日期相关的问题

包括的日期段(实际情况可能比下例更多组合) 

2008-10-1 至 2008-10-31 
2008-11-10 至 2008-11-30 
2008-9-10 至 2008-9-26 

不包括的日期段(实际情况可能比下例更多组合) 

2008-10-10 至 2008-10-21 
2008-10-29 至 2008-11-13 
2008-9-20 至 (2008-9-30) 

最后按上面两种条件,筛选出下面这种组合,挑选出包括的日期段 
2008-10-1 2008-10-10 
2008-10-21 2008-10-29 
2008-11-13 2008-11-30 
2008-9-10 2008-9-20 

求高手解答 --------------------编程问答-------------------- 晕,这是哪门子的需求?

说说具体的应用场景? --------------------编程问答-------------------- 用作机票的运价录入的一个需求,客户选择好所有日期段后,在后台要拼成最后的结果,存进库,想着头有点大,各种可能性太多了 --------------------编程问答-------------------- up --------------------编程问答-------------------- 不太清楚什么意思 --------------------编程问答-------------------- 包括的日期段(实际情况可能比下例更多组合) 

2008-10-1 至 2008-10-31 
2008-11-10 至 2008-11-30 
2008-9-10 至 2008-9-26 

不包括的日期段(实际情况可能比下例更多组合) 

2008-10-10 至 2008-10-21 
2008-10-29 至 2008-11-13 
2008-9-20 至 (2008-9-30) 
写起来的确可能比较麻烦,包括或者不包括里面不会有重复的时间吧?
2008-10-1 至 2008-10-31 
2008-11-10 至 2008-11-30 
2008-9-10 至 2008-9-26 
即这里没有重叠的
我的想法是先都升序排列一下,然后再去比较。
简化点说:
a-b
c-d
不包括
e-f
g-h
当然这是升序排列以后的结果,那么现在应该做一个循环,先看a-b这一个与不包括的关系,其他的走一个循环:
if a<e then
  if b<e 取a-b
  if b>e 先取a-e
    if b>f 再取f-b
    if b<f 不取
if a>e
if a>f 不取
if a<f 
  反正你每种都去分析一下就是了,呵呵,当然这只是我个人的想法,这个不好看的,你可以简化成数字来搞
如:1-5,7-10里没有2-6,9-10这种类似的啦... --------------------编程问答-------------------- 这种需求还真是变态啊...
--------------------编程问答-------------------- 这个问题嘛,
遍历一下即可搞定,回去看看数据结构,很简单的算法即可实现。
给个思路,
struct 时间段
{
    起始时间,
     结束时间
}

然后先在包含的时间段中,内部排序。同时在不包括的时间段中再内部排排序。
最后再把它们一起写个函数即可搞定。 --------------------编程问答-------------------- LS的看来蛮厉害的嘛,呵呵,我也该补补数据结构了... --------------------编程问答-------------------- public struct DatePair
        {
            public DateTime beginDate;
            public DateTime endDate;
        }

        private System.Collections.ArrayList GetValidDate(DatePair[] validPair, DatePair[] notValidPair)
        {
            System.Collections.ArrayList arr = new System.Collections.ArrayList();

            for (int i = 0; i < notValidPair.Length; i++)
            {
                for (int j = 0; j < validPair.Length; j++)
                {
                    if (notValidPair[i].beginDate >= validPair[j].endDate || notValidPair[i].endDate <= validPair[j].beginDate)
                        break;
                    if (notValidPair[i].beginDate < validPair[j].beginDate && notValidPair[i].endDate < validPair[j].endDate)
                    {
                        DatePair dp = new DatePair();
                        dp.beginDate = notValidPair[i].endDate.AddDays(1);
                        dp.endDate = validPair[j].endDate;
                        arr.Add(dp);
                        break;
                    }
                    //其它还有若干种情况
                }
            }
            return arr;
        } --------------------编程问答-------------------- 什么意思啊,没看明白?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,