一个公司的系统,有这么一个模块。
就是根据当前时间,还有一个项任务的工作时间,来得到结束的具体时间。
这里面有个比较难的设计就是怎么去考虑这工作时间内的假日问题。
要知道假日是不能统计到工作天数中去的。假日可以由管理员添加,修改,删除。
添加的时候是按照起始时间,假日的天数。
有公共的假日,也有公司的休息假日,还有一些特别的假日。我是个菜鸟。我就想问问怎么去设计比较好。

解决方案 »

  1.   


    设计假日(Holiday)接口
    比如
    boolean isHoliday(Calendar cd);
    实现公共假日PublicHoliday(固定代码)实现可管理的假日ManageableHoliday 根据管理员设置的假日
    做个单例bean(也许有存在的系统级bean作为宿主),保存假日集合需要统计天数的时候 循环下假日集合呵呵,很不成熟的设计,lz参考
      

  2.   

    给你一段代码 也是我从网上找来的  与你的问题有点关系 呵呵 基于oracle
    CREATE OR REPLACE FUNCTION Get_WorkingDays(
      ny IN VARCHAR2
    ) RETURN INTEGER IS
    /*-----------------------------------------------------------------------------------------
    函数名称:Get_WorkingDays
    中文名称:求某一年月中共有多少工作日
    作者姓名: XINGPING
    编写时间: 2004-05-23
    输入参数:NY:所求包含工作日数的年月,格式为yyyymm,如200405
    返 回 值:整型值,包含的工作日数目。
    算法描述:使用Last_day函数计算出参数所给年月共包含多少天,根据这个值来构造一个循环。在这个循环中先求这个月的每一天与一个已知是星期天的日 期(2001-12-30是星期天)的差,所得的差再对7求模。如果所求日期在2001-12-30以前,那么所得的差既是负数,求模后所得值范围为大于 -6,小于0,如-1表示星期六,故先将求模的结果加7,再求7的模. 如过所得值不等于0和6(即不是星期六和星期天),则算一个工作日。      
    ----------------------------------------------------------------------------------------*/
      Result INTEGER := 0;
      myts INTEGER;      --所给年月的天数
      scts INTEGER;      --某天距2001-12-30所差的天数
      rq   DATE;
      djt INTEGER := 1;   -- 
    BEGIN
      myts := to_char(last_day(to_date(ny,'yyyymm')),'dd');  
      LOOP 
        rq := TO_date(ny||substr(100+djt,2),'yyyymmdd');
        scts := rq - to_date('2001-12-30','yyyy-mm-dd');
        IF MOD(MOD(scts,7)+7,7) NOT IN(0,6) THEN
          Result := Result + 1;
        END IF;
        djt := djt + 1;  
        EXIT WHEN djt>myts;
      END LOOP;  
      RETURN Result;  
    END Get_WorkingDays;