yijay555
yijay555
2010-06-01 15:22

急求一个时间的比较计算方法

已采纳

要提供一个方法,有一个参数,date类型
然后提取当前的数据库时间。比较两个两个date数据之间的分钟差!

比较规则:
1:数据库有一张基础信息表,是用于保存是否工作日以及开始和结束时间的
表结构:
编号 类型 开始时间 结束时间
id datetype startTime endTime

添加信息如:1,”工作日“, ”27-5月 -10 02.46.38.593000 上午“, ”28-5月 -10 06.00.00.000000 下午“
2,”非工作日“, ”29-5月 -10 02.46.38.593000 上午“, ”30-5月 -10 06.00.00.000000 下午“
3,”工作日“, ”31-5月 -10 02.46.38.593000 上午“, ”4-6月 -10 06.00.00.000000 下午“

比如现在将要传给我一个时间是2010年5月28日10:00:00 ,我取得当前的数据库时间是2010年6月1日15:00:00
返回两个时间中间经历的工作日分钟数。每天按8小时正常工作时计算。从8:00--12:00,14:00--18:00;

比较的时候只计算两个时间中间的工作日的分钟数

请各位各位帮忙解决下。小弟谢谢了

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

6条回答

  • monica10617 陪公主读书 11年前

    我能理解你的大体想法,不知道下面的代码能不能解决你的问题。
    [code="java"]
    /**
    *
    * @param inputDate 传给你的时间
    * @return
    /
    public int convertDate(Date inputDate) {
    Date nowDate = new Date();
    // 不清楚你这个方法的查询逻辑是什么样的?
    // 如果你输入的nowDate是2010年6月2日,数据库里有一个记录【开始时间6月1日,结束时间是6月3日,工作日】
    // 那这条记录会包含到这个查询结果集吗?------->如果没有包括进去的话,34行--68行的代码能解决这个疏漏。
    Collection wdList = new ArrayList();
    int ret = 0;
    for (Iterator iterator = wdList.iterator(); iterator.hasNext();) {
    WorkDate workDate = (WorkDate) iterator.next();
    if (workDate.getDateType().equals("工作日")) {
    ret += getDays(workDate.getStartTime(), workDate.getEndTime()) * 8 * 60;
    }
    }
    /
    ********************解决疏漏的代码开始********************/
    Calendar cal = Calendar.getInstance();
    cal.setTime(nowDate);
    //当前年份
    int now_year = cal.get(Calendar.YEAR);
    //当前月份
    int now_month = cal.get(Calendar.MONTH) + 1;
    //当前日期
    int now_day = cal.get(Calendar.DATE);
    //当前时间,24时制
    int now_hour = cal.get(Calendar.HOUR_OF_DAY);
    //当前分钟
    int now_minute = cal.get(Calendar.MINUTE);
    //查询你的基础表,查询条件是:nowDate>=开始时间 && nowDate<=结束时间的记录
    Collection tmpList = new ArrayList();
    for (Iterator iterator = tmpList.iterator(); iterator.hasNext();) {
    WorkDate workDate = (WorkDate) iterator.next();
    if (workDate.getDateType().equals("工作日")) {
    //将当前日期的前一天设置到Calendar
    cal.set(now_year, now_month - 1, now_day - 1);
    Date yesterday = cal.getTime();
    //计算从开始时间到昨天的工作分钟数
    ret += getDays(workDate.getStartTime(), yesterday) * 8 * 60;
    if (now_hour < 12) {
    //12时前
    ret += ((now_hour - 8) * 60 + now_minute);
    } else if (now_hour >= 12 && now_hour //中午休息时
    ret += (4 * 60);
    } else if (now_hour >= 14) {
    //下午工作时间
    ret += (4 * 60 + (now_hour - 12) * 60 + now_minute);
    }
    }
    }
    /*********************解决疏漏的代码结束********************/
    return ret;
    }

    /**
     * 从开始日期到结束日期总共有多少天。例如:从2010年3月1日到2010年3月2日,总共有2天。
     * 
     * @param begin
     *            开始日期
     * @param end
     *            结束日期
     * @return
     */
    private int getDays(Date begin, Date end) {
    
        return Long
                .valueOf(
                        ((end.getTime() - begin.getTime() + 1000000) / (3600 * 24 * 1000)) + 1)
                .intValue();
    
    }
    

    [/code]

    点赞 评论 复制链接分享
  • wu_7013_cn wu_7013_cn 11年前

    仔细看看Timestamp、Calendar的API,应该都能解决的。 :wink:

    点赞 评论 复制链接分享
  • zxtzxz zxtzxz 11年前

    没用过TIMESTAMP类型,给你个思路自己解决吧,还是用上面我给你的那个方法,查询出datetype=‘工作日’ startTime>输入日 endTime <当前日 的数据
    然后遍历结果,调用我那个方法,统计期间每天的工作时间,然后查出输入日的结束时间,再调方法,同理查出今天的工作时间

    点赞 评论 复制链接分享
  • zxtzxz zxtzxz 11年前

    [quote]就是数据库的date类型,看到的就是这种效果 [/quote]
    什么数据库date类型数据是这个格式啊?数据不都是你自己插进去的啊?

    点赞 评论 复制链接分享
  • zxtzxz zxtzxz 11年前

    我想知道你数据库中 startTime endTime 有没有固定格式,什么含义

    点赞 评论 复制链接分享
  • zxtzxz zxtzxz 11年前

    /**
    * 获取两个时间datetime1-datetime2差的long型数组,按索引依次为天,时,分,秒
    * @param datetime1 时间字符串
    * @param datetime2 时间字符串
    * @return 返回一个长度为4的long数组,按索引依次为天,时,分,秒
    */
    public static long[] getTimesInterval(String datetime1,String datetime2){
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    long[] interval=new long[4];
    try {
    Date now = df.parse(datetime1);
    Date date=df.parse(datetime2);
    long l=now.getTime()-date.getTime();
    long day=l/(24*60*60*1000);
    interval[0]=day;
    long hour=(l/(60*60*1000)-day*24);
    interval[1]=hour;
    long min=((l/(60*1000))-day*24*60-hour*60);
    interval[2]=min;
    long s=(l/1000-day*24*60*60-hour*60*60-min*60);
    interval[3]=s;
    } catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return interval;
    }

    点赞 评论 复制链接分享

相关推荐