计算两个时间戳之间的工作日间隔时间(9:30-12:00 13:00-18.30)
2015-07-22 15:15
507 查看
package com.hxjr.utils.date; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * 计算任意2个日期内的工作日(没有考虑到国定假日) * * @author user * */ public class DateCal { /** * @param args */ public static void main(String[] args) { try { String strDateStart = "2015-07-16 08:15:00"; String strDateEnd = "2015-07-16 13:40:00"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date_start = sdf.parse(strDateStart); Date date_end = sdf.parse(strDateEnd); DateCal app = new DateCal(); Calendar cal_start = Calendar.getInstance(); Calendar cal_end = Calendar.getInstance(); cal_start.setTime(date_start); cal_end.setTime(date_end); System.out.println("星期-->" + app.getChineseWeek(cal_start) + " 日期-->" + cal_start.get(Calendar.YEAR) + "-" + (cal_start.get(Calendar.MONTH) + 1) + "-" + cal_start.get(Calendar.DAY_OF_MONTH)); System.out.println("星期-->" + app.getChineseWeek(cal_end) + " 日期-->" + cal_end.get(Calendar.YEAR) + "-" + (cal_end.get(Calendar.MONTH) + 1) + "-" + cal_end.get(Calendar.DAY_OF_MONTH)); System.out.println("工作日为--(按小时)>" + app.getWorkingDay(cal_start, cal_end)/(3600*1000*1.0)); System.out.println("工作日時間为--(按毫秒)>" + app.getWorkingDay(cal_start, cal_end)); } catch (Exception e) { // TODO: handle exception } } public int getDaysBetween(java.util.Calendar d1, java.util.Calendar d2) { if (d1.after(d2)) { java.util.Calendar swap = d1; d1 = d2; d2 = swap; } int days = d2.get(java.util.Calendar.DAY_OF_YEAR) - d1.get(java.util.Calendar.DAY_OF_YEAR); int y2 = d2.get(java.util.Calendar.YEAR); if (d1.get(java.util.Calendar.YEAR) != y2) { d1 = (java.util.Calendar) d1.clone(); do { days += d1.getActualMaximum(java.util.Calendar.DAY_OF_YEAR); d1.add(java.util.Calendar.YEAR, 1); } while (d1.get(java.util.Calendar.YEAR) != y2); } return days; } /** * 计算2个日期之间的相隔天数 * * @param d1 * @param d2 * @return */ public Long getWorkingDay(java.util.Calendar d1, java.util.Calendar d2) { int result = -1; long result1 = -1; if (d1.after(d2)) { // swap dates so that d1 is start and d2 is end java.util.Calendar swap = d1; d1 = d2; d2 = swap; } /*//如果两个时间在同一周并且都不是周末日期,则直接返回时间差,增加执行效率 if(d1.get(Calendar.YEAR)==d2.get(Calendar.YEAR) && d1.get(Calendar.WEEK_OF_YEAR)==d2.get(Calendar.WEEK_OF_YEAR) && d1.get(Calendar.DAY_OF_WEEK)!=1 && d2.get(Calendar.DAY_OF_WEEK)!=7 && d1.get(Calendar.DAY_OF_WEEK)!=1 && d2.get(Calendar.DAY_OF_WEEK)!=7){ return new Long(d2.getTimeInMillis()-d1.getTimeInMillis()); }*/ long charge_start_date = 0;// 开始日期的日期偏移量 long charge_end_date = 0;// 结束日期的日期偏移量 // 日期不在同一个日期内 if (d1.get(Calendar.DAY_OF_WEEK)!= 1 && d1.get(Calendar.DAY_OF_WEEK)!=7) {// 开始日期为星期六和星期日时偏移量为0 charge_start_date += (7-d1.get(Calendar.DAY_OF_WEEK))*8*3600000; System.out.println(d1.getTime().getHours()+":"+d1.getTime().getMinutes()); if(d1.getTime().getHours()>=9&&d1.getTime().getMinutes()>=30||d1.getTime().getHours()>=10){ if(d1.getTime().getHours()>=13){ charge_start_date -= (d1.getTime().getHours()-13+2.5)*60000*60; charge_start_date -= d1.get(Calendar.MINUTE)*60000; charge_start_date -= d1.get(Calendar.SECOND)*1000; charge_start_date -= d1.get(Calendar.MILLISECOND); }else if(d1.getTime().getHours()>=18&&d1.getTime().getMinutes()>=30){ charge_start_date -= 8*3600000; }else if(d1.getTime().getHours()>=12&&d1.getTime().getHours()<13){ charge_start_date -= 2.5*60000*60; }else if(d1.getTime().getHours()<12){ System.out.print("aaa<12"); charge_start_date -= (d1.getTime().getHours()-9)*60000*60; charge_start_date -= d1.get(Calendar.MINUTE)*60000-30*60000; charge_start_date -= d1.get(Calendar.SECOND)*1000; charge_start_date -= d1.get(Calendar.MILLISECOND); } } } if (d2.get(Calendar.DAY_OF_WEEK)!= 1 && d2.get(Calendar.DAY_OF_WEEK)!=7) {// 结束日期为星期六和星期日时偏移量为0 //只有在结束时间为非周末的时候才计算偏移量 charge_end_date += (7-d2.get(Calendar.DAY_OF_WEEK))*8*3600000; if(d2.getTime().getHours()>=9&&d2.getTime().getMinutes()>=30||d2.getTime().getHours()>=10){ System.out.print("aaa>13"); if(d2.getTime().getHours()>=13){ System.out.print("aaa>13"); charge_end_date -= (d2.getTime().getHours()-13+2.5)*60000*60; charge_end_date -= d2.get(Calendar.MINUTE)*60000; charge_end_date -= d2.get(Calendar.SECOND)*1000; charge_end_date -= d2.get(Calendar.MILLISECOND); }else if(d2.getTime().getHours()>=18&&d2.getTime().getMinutes()>=30){ charge_end_date -= 8*3600000; }else if(d2.getTime().getHours()>=12&&d2.getTime().getHours()<13){ System.out.print("aaa>12"); charge_end_date -= 2.5*60000*60; }else if(d2.getTime().getHours()<12){ charge_end_date -= (d2.getTime().getHours()-9)*60000*60; charge_end_date -= d2.get(Calendar.MINUTE)*60000-30*60000; charge_end_date -= d2.get(Calendar.SECOND)*1000; charge_end_date -= d2.get(Calendar.MILLISECOND); } } } result = (getDaysBetween(this.getNextMonday(d1), this.getNextMonday(d2)) / 7)* 5; result1 = result*8*3600000+charge_start_date-charge_end_date; return result1; } public String getChineseWeek(Calendar date) { final String dayNames[] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" }; int dayOfWeek = date.get(Calendar.DAY_OF_WEEK); // System.out.println(dayNames[dayOfWeek - 1]); return dayNames[dayOfWeek - 1]; } /** * 获得日期的下一个星期一的日期 * * @param date * @return */ public Calendar getNextMonday(Calendar date) { Calendar result = null; result = date; do { result = (Calendar) result.clone(); result.add(Calendar.DATE, 1); } while (result.get(Calendar.DAY_OF_WEEK) != 2); return result; } }
相关文章推荐
- Android 自定义雷达图
- 【暴力搜索】[POJ 1186]方程的解数
- 【数据结构与算法分析1.2】编写一个程序求解字谜游戏问题
- 棋盘覆盖问题
- flume+kafka+storm
- Codeforces469C——构造——Game
- http状态码 200 304 404 503等
- js中下载弹窗链接
- 智能指针总结及应用(一)
- hdu 5294 Tricks Device
- SecureCRT 常用命令大全
- .NET知识点构架
- hdu5288 多校
- Xshell连接Linux服务器总掉线
- Zookeeper Introduce Zookeeper原理介绍
- 几种线程池的实现算法分析
- nginx 1.9 + tomcat8 + nfs 配置集群环境
- android官方技术文档翻译——设计时布局属性
- java SpringMVC 邮件发送配置及Code
- Spring配置声明