怎么排除两个日期之间的节假日,下面我这个是计算排除周末的工作时间,怎么把节假日排除掉,求指教

package server;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class CalculateHours {

SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); //这里的格式可以自己设置 

//设置上班时间:该处时间可以根据实际情况进行调整
int abh = 9;//上午上班时间,小时
int abm = 00;//上午上班时间,分钟
int aeh = 12;//上午下班时间,小时
int aem = 0;//上午下班时间,分钟
int pbh = 13;//下午上班时间,小时
int pbm = 00;//下午上班时间,分钟
int peh = 18;//下午下班时间,小时
int pem = 0;//下午下班时间,分钟
float h1 = abh+(float)abm/60;
float h2 = aeh+(float)aem/60;
float h3 = pbh+(float)pbm/60;
float h4 = peh+(float)pem/60;
float hoursPerDay = h2-h1+(h4-h3);//每天上班小时数
int daysPerWeek = 6;//每周工作天数
long milsecPerDay = 1000*60*60*24;//每天的毫秒数
float hoursPerWeek = hoursPerDay*daysPerWeek;//每星期小时数
public float calculateHours(String beginTime, String endTime){
    System.out.println("设置的上班时间为:"+abh+":"+abm+"-"+aeh+":"+aem
            +"   "+pbh+":"+pbm+"-"+peh+":"+pem);
    System.out.println("每天工作时间为:"+hoursPerDay+"小时");
    //对输入的字符串形式的时间进行转换
    Date t1 = stringToDate(beginTime);//真实开始时间
    Date t2 = stringToDate(endTime);//真实结束时间
    System.out.println("设置的开始时间为:"+printDate(t1));
    System.out.println("设置的结束时间为:"+printDate(t2));
    //对时间进行预处理
    t1 = processBeginTime(t1);
    t2 = processEndTime(t2);
    System.out.println("预处理后的开始时间为:"+printDate(t1));
    System.out.println("预处理后的结束时间为:"+printDate(t2));
    //若开始时间晚于结束时间,返回0
    if(t1.getTime()>t2.getTime()){
        System.out.println("总工作时间为:0小时");
        return 0;
    }
    //开始时间到结束时间的完整星期数
    int weekCount = (int) ((t2.getTime()-t1.getTime())/(milsecPerDay*7));
    System.out.println("时间间隔内共包含了"+weekCount+"个完整的星期");
    float totalHours = 0;
    totalHours += weekCount * hoursPerWeek;
    //调整结束时间,使开始时间和结束时间在一个星期的周期之内
    t2.setTime(t2.getTime()-weekCount*7*milsecPerDay);
    System.out.println("结束时间调整为:"+printDate(t2));
    int dayCounts = 0;//记录开始时间和结束时间之间工作日天数
    //调整开始时间,使得开始时间和结束时间在同一天,或者相邻的工作日内。
    while(t1.getTime()<=t2.getTime()){
        Date temp = new Date(t1.getTime()+milsecPerDay);
        temp = processBeginTime(temp);
        temp.setHours(t1.getHours());
        temp.setMinutes(t1.getMinutes());
        if(temp.getTime()>t2.getTime()){
            break;
        }else{
            t1 = temp;
            dayCounts++;
        }
    }
    System.out.println("开始时间向后移动了"+dayCounts+"个工作日");
    System.out.println("开始时间调整为:"+printDate(t1));
    totalHours += dayCounts * hoursPerDay;
    float hh1 = t1.getHours() + (float)t1.getMinutes()/60;
    float hh2 = t2.getHours() + (float)t2.getMinutes()/60;
    //处理开始结束是同一天的情况
    if(t1.getDay()==t2.getDay()){
        float tt = 0;
        tt = hh2 - hh1;
        if(hh1>=h1&&hh1<=h2&&hh2>=h3){
            tt = tt - (h3-h2);
        }
        totalHours += tt;
    }else{
        //处理开始结束不是同一天的情况
        float tt1 = h4 - hh1;
        float tt2 = hh2 - h1;
        if(hh1<=h2){
            tt1 = tt1 - (h3-h2);
        }
        if(hh2>=h3){
            tt2 = tt2 - (h3-h2);
        }
        totalHours += (tt1 + tt2);
    }
    System.out.println("总工作时间为:"+totalHours+"小时");
    return totalHours;
}

/**
 * 格式化输出时间: yyyy-mm-dd hh:mm:ss 星期x
 * @param t
 * @return
 */
private String printDate(Date t) {
    String str;
    String xingqi = null;
    switch (t.getDay()) {
    case 0:
        xingqi = "星期天";
        break;
    case 1:
        xingqi = "星期一";
        break;
    case 2:
        xingqi = "星期二";
        break;
    case 3:
        xingqi = "星期三";
        break;
    case 4:
        xingqi = "星期四";
        break;
    case 5:
        xingqi = "星期五";
        break;
    case 6:
        xingqi = "星期六";
        break;
    default:
        break;
    }
    str = format.format(t)+"  "+xingqi;
    return str;
}

/**
 * 对结束时间进行预处理,使其处于工作日内的工作时间段内
 * @param t
 * @return
 */
private Date processEndTime(Date t) {
    float h = t.getHours() + (float)t.getMinutes()/60;
    //若结束时间晚于下午下班时间,将其设置为下午下班时间
    if(h>=h4){
        t.setHours(peh);
        t.setMinutes(pem);
    }else {
        //若结束时间介于中午休息时间,那么设置为上午下班时间
        if(h>=h2&&h<=h3){
            t.setHours(aeh);
            t.setMinutes(aem);
        }else{
            //若结束时间早于上午上班时间,日期向前推一天,并将时间设置为下午下班时间
            if(t.getHours()<=h1){
                t.setTime(t.getTime()-milsecPerDay);
                t.setHours(peh);
                t.setMinutes(pem);
            }
        }
    }
    //若结束时间是周末,那么将结束时间向前推移到最近的工作日的下午下班时间
    if(t.getDay()==0){
        t.setTime(t.getTime()-milsecPerDay*(t.getDay()==6?1:2));
        t.setHours(peh);
        t.setMinutes(pem);
    }
    return t;
}

/**
 * 对开始时间进行预处理
 * @param t1
 * @return
 */
private Date processBeginTime(Date t) {
    float h = t.getHours() + (float)t.getMinutes()/60;
    //若开始时间晚于下午下班时间,将开始时间向后推一天
    if(h>=h4){
        t.setTime(t.getTime()+milsecPerDay);
        t.setHours(abh);
        t.setMinutes(abm);
    }else {
        //若开始时间介于中午休息时间,那么设置为下午上班时间
        if(h>=h2&&h<=h3){
            t.setHours(pbh);
            t.setMinutes(pbm);
        }else{
            //若开始时间早于上午上班时间,将hour设置为上午上班时间
            if(t.getHours()<=h1){
                t.setHours(abh);
                t.setMinutes(abm);
            }
        }
    }
    //若开始时间是周末,那么将开始时间向后推移到最近的工作日的上午上班时间
    if(t.getDay()==0){
        t.setTime(t.getTime()+milsecPerDay*(t.getDay()==6?2:1));
        t.setHours(abh);
        t.setMinutes(abm);
    }
    return t;
}

/**
 * 将字符串形式的时间转换成Date形式的时间
 * @param time
 * @return
 */
private Date stringToDate(String time){
    try {
        return format.parse(time);
    } catch (ParseException e) {
        e.printStackTrace();
        return null;
    }
}
public static void main(String[] args) {
    String beginTime = "2015-08-28 10:00:00";  
    String endTime = "2015-08-31 13:30:00";  
    CalculateHours ch = new CalculateHours();  
    float a=ch.calculateHours(beginTime, endTime);  
    System.out.println(a);
    float  b   =  (float)(Math.round(a*10))/10;
    System.out.println(b);

}

}

0
扫码支付0.1元 ×
其他相关推荐
根据开始和结束时间计算工作日,排除指定节假日和双休日
1.建立一个数据库表结构(HOLIDAY)保存设定好的节假日,包括三个字段ID,DATE,DESCRIPTION 2.建立存储过程dateArithmetic: --计算节假日 alter function dateArithmetic( @stratDate datetime, --开始时间 @endDate datetime --结束时间 ) returns int...
JS端计算一段时间内工作日的天数,排除周末和法定节假日,同时考虑到调休日
公司项目最近有个需求,要统计人员有多少天没使用工作系统。 原本只是简单地将当前时间与最后使用时间相减,得到的天数做为未使用的天数。 结果,领导说这样不行,需要计算得精确些,于是上网搜到不少解决方案,不是通过循环解决,就是都不符合我们的实际情况,便自己写一个。 项目是jQuery的,所以循环语句也需要自己改一下。希望对同样需求的兄弟姐妹们有所帮助,也希望大家多多拍砖,提点意见哈!
java 排除法定节假日以及正常周六日,计算两个Date相差的小时数
项目组有一个需求,计算两个Date类型参数,相差的小时数。业务上有一些特殊的用途,可能用于绩效考核的目的吧… 如果不排除节假日周六日的话,处理起来非常easy,是个程序员都能写出来,但是…如果要排除法定节假日,排除正常周六日,同时特殊支持法定的工作日(有一些周六日,国家强制正常上班),那么处理起来就非常麻烦,我耗时大概1天半的时间,用基础的Date和Calendar实现,下面是具体的实现代码,要是...
计算超时或工作日 排除周末
最近做一个需求,计算一个工作人员处理一个流程需要花费的时间,排除周末处理时间,只算工作日处理时长,用来比对是否超时。以下用mysql函数的方日期式计算两个之间工作日的时间差: BEGIN declare minutes INT; declare  flag VARCHAR(2); declare  days INT; declare  weeks INT; declare  week_...
js 计算当前时间和和一段时候后的工作日天数,排除周末和法定假日
例:计算当前时间 过5个(设为N个工作日)工作日后的的日期。 思路: 获取当前系统时间 +n(n个工作日后) + 之间的周末和法定假日天数 因为法定假日是不变的 ,所以 首先我们将法定假日设定为一个数组 //节假日数组 var Holiday = [&quot;2018/1/1&quot;,&quot;2018/1/15&quot;,&quot;2018/2/19&quot;,&quot;2018/5/28&quot;,&quot;2018/7/...
Project 制作工作进度计划 排除休息日
Project 制作工作进度计划 排除休息日
计算2个日期相差天数、去除节假日周末
拿去可以直接用的计算2个日期间相差天数,并过滤了节假日和周末。
java Calendar类时间操作简单总结,计算工作日排除法定假日以及周末
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); //当前月前一个月的1号日期 Calendar cal =Calendar.getInstance();//获取当前日期 cal.add(Calendar.MONTH, -1);//设置月份为当前月上个月 cal.set(Ca
SQLSERVER 得出指定月的工作日天数(没有考虑国家法定假日,只排除周六周日)...
[code=&quot;sql&quot;] --获取指定月的工作日天数(不考虑国家法定节假日,只排除周六周日, 已在休假行事历中设置休息天的也能获得工作天数) CREATE FUNCTION [dbo].[getCountOfWorkdaysOfMonth](@year_in NVARCHAR(4), @month_in NVARCHAR(2), @restDayStr NVARCHAR(100)) --yea...
数据库实现计算工作日时间差--去除节假日及周末
由于统计需求,要求计算2个时间差,并且要求去除节假日和周末的时间。 说一下需求规则: 1、如果开始时间和结束时间在一个休假时间段内,时间差为0,比如10.2到10.4这种。 2、其他情况,只计算在休假时间外的。 首先说一下思路: 1、我在t_rest_day表中存入了每一年的休假数据(节假日+周末),这样免得去判断节假日和周末重复的情况。 2、针对开始时间进行加1天循环,直到大于结束时
SQL计算两个日期之间的工作日天数,去除法定节假日和周末
项目要求:需要计算两个日期之间的工作日天数,包含元旦、五一、十一等法定假日。 网上查询很多SQL函数,最终发现都不太理想,例如国庆放假可能会调休,周末也要上班。所以唯一的解决方案是建立一张工作日时间表,通过这张表去判断当天是否属于工作日。 1、新建一张数据库表,【工作日】 上传到CSDN资源了,下载后倒入数据库就可以 https://download.csdn.net/download...
计算除周六日、法定节假日以外两个日期之间的间隔天数
计算除周六日、法定节假日以外两个日期之间的间隔天数
java计算两个日期之前的天数(工作日),排除节假日和周末
如题所说,计算两个日期之前的天数,排除节假日和周末。这里天数的类型为double,因为该功能实现的是请假天数的计算,有请一上午假的为0.5天。 不够很坑的是每个日期都要查询数据库,感觉很浪费时间。 原则:   1.节假日存放在数据库中 实现步骤:   1.循环每个日期   2.判断每个日期是否为节假日或者为周末   3.若不是节假日和周末,天数+1
oracle计算一个日期加上指定工作日(排除周六周日和一系列节假日)时间
第一步: 创建一个表格holiday用于灵活存放节假日日期(周末除外),如果和周末日期重复,则无需添加到该表格中: Sql代码   create table HOLIDAY  (      ID                   VARCHAR2(45)                    not null,      HL_DATE              D
计算指定日期到今天的工作日,排除周末,国家法定节假日
有两张表,以及几个函数,求出一年当中的工作日
java计算日期不包括周末、不包括节假日、不包括非工作时间、考虑加班时间
需求: 1、给出开始时间beginDate,结束时间endDate,计算两个时间之间的时间差 2、给出一个时间nowDate,计算其加上x小时之后的时间。 注: 时间的计算不能计算非工作时间。即,不包括周末、不包括节假日、不包括非工作小时、考虑正常加班时间 例如:工作时间为:【8:00~12:00,14:00~18:00】 例如:国庆假期上班第一天10月9号是周日,这种情况时间也要计算...
Java去除两个日期之间的周末,只算工作日(传递Date对象)
/** * 获取两个日期之间的工作日天数 * @param startDate * @param endDate * @return 间隔的天数 */ @SuppressWarnings(&quot;deprecation&quot;) public static int getDutyDays(java.util.Date startDate,java.util.Date en...
计算两个日期之间的工作日(去掉周末和节假日)
公司要写售后的一个功能,用到这个功能,在一个贴吧上找到的,整理一下 package com.utouu.uphone.commons; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import
SQL计算时间差并排除周末
CREATE FUNCTION DI_FN_GET_WorkDay (@begin DATETIME , @end DATETIME ) RETURNS int BEGIN DECLARE @i INT , @j INT SET @i = 0 SET @j = 0 IF @end &amp;gt; @begin BEGIN WHILE DATEDIFF(d, DATEADD(d, @i, ...
判断两个日期之间除去周末和规定节假日剩余的天数(精确度为半天)
这两天在写一个项目,考勤系统,写到请假的一块,需要判断请假的天数,
C#取两个时间的时间差并去除周末
protected void Page_Load(object sender, EventArgs e)     {    DateTime start = Convert.ToDateTime("2012-12-10");        
java代码去除时间段内的休息日
@SuppressWarnings("deprecation")   public int getDutyDays(String strStartDate,String strEndDate) {   SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");   Date startDate=null;   Date endDate
Java模块 -- 计算工作日 (Excel导入法定假日至数据库 排除周六 周日 法定假日) Calendar
有一个小功能,要求是按照指定时间,计算出规定的工作日,排除国家法定节假日,周日,周六... 网上找了一些案例,但都算不准,但是它们的思路和方法可以借鉴下...于是一边想,一边改...就出来了.... 国家法定假日,Java 不可能有专门的API去做调用.. 所以,我的思路是,做一个页面,将当年的所有法定假日输入到Excel中,用Excel去导入至数据库,然后从数据库取出数据,去和当前
excel工作量清单计算开始、结束时间,自动跳过节假日
工作量清单,excel转为 mpp,自动跳过非工作日   复制任务名称、工时(工作量汇总(人/日 *8))、设置第一个开始时间、资源名称、前置任务 之后会自动计算出来。
java 计算工作时间除去节假日,双休日
package common.util; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; impo...
c# 计算两日期的工作时间间隔(排除非工作日)及计算下一个工作时间点.
一个日期段如工作时间为 8:00 至 17:00 public class TimeHelper { /// /// 计算时间间隔 /// /// /// /// /// /// public static TimeSpan
在oracle中,计算出任意日期之间的工作日天数(未考虑节假日)
[code=&quot;java&quot;] create or replace function fun_workday(startdate in varchar2, enddate in varchar2)return number IS TOTALVALUE NUMBER; begin select count(*) into TOTALVALUE from ( select rownum rn...
oracle sql计算一段时间内(除去周六日)的秒数
利用 oracle sql 实现 计算一段时间内(除去周六日)的秒数
sql跳过非工作日(周末和节假日)
简介:场景1:基于开始日期和工期,推算结束日期。 场景2:基于开始日期和结束日期,计算工期 注:需要自己做界面维护工作日表(s_WorkDay)和节假日表(s_SpecialDay)  涉及到的数据表 IF OBJECT_ID('s_WorkDay') IS NULL BEGIN CREATE TABLE s_WorkDay([Monday] [TINYINT]
JAVA_判断日期是否为工作日(排除节假日和调整周末上班)
java判断日期是否为工作日(排除节假日和调整周末上班) 判断当前日期是否为工作日,包括判断是否周末,是否节假日,是否周末调整上班。 判断是否周末,我们可以通过java方法就可以实现,但是判断是否节假日和,调整的周末上班,这个就需要我们自己去维护了。 搞2个集合,分别来存节假日和调整上班的日期。 public class CalendarTest { //节假日列表 pri...
如何用js计算工作日(去掉周六周日)
近期做项目时 客户提出一个新需求,计划的工期要去掉双休日节假日,因为节假日的特殊性(由国家规定,非固定的不好计算,无法预测)不做考虑。 下面我们探讨下如何将两个时间段之间的周末去掉 首先一种比较笨的方法是 一天一天去判断是否是周六或周天,该方法简单粗暴 主要用 getDay()去判断获得的星期数是否等于 0或6 是的话则在周末的天数累加 最后去开始与结束日...
计算有效工作日(跳过节假日)
在实际开发过程中,我们很多时候会遇到节假日处理的问题。由于前段时间工作需要,所以通过各种平台搜集资料,整理出下面的代码。 备注:主要是给定一个初始日期,然后给定一个时间范围,要求自动跳过节假日以及双休日,最后返回一个工作日的日期,具体代码如下:         ///         /// 根据指定日期,计算出给定时间间隔的下一个工作日的日期         /
php 排除周末与节假日程序实例代码
date_default_timezone_set('prc'); /** * 求取从某日起经过一定天数后的日期, * 排除周六周日和节假日 * @param $start       开始日期 * @param $offset      经过天数 * @param $exception 例外的节假日 * @param $allow       允许的日期(预留参数) * @ret
C#实现工作日和休息日(包括法定节假日)的计算
一、开发背景:   最近在公司开发的系统中,需要计算工作日,就是给出一个采购周期(n天),我需要计算出在n个工作日之后的日期。开始准备去调接口(ps:找了半天发现没有太合适的,还有吐槽下国家政府单位都没有官方接口的),但是负责这个项目的大佬说,万一别个的接口崩了,会影响我们自己的系统的正常运行,自己开发还是稳点,我就写了这个功能,特此记录下实现这个功能的思路。 二、定义:   工
Java:计算一个日期加上指定工作日数(排除周六周日和一系列节日)
工作时遇到的,随便写了个,欢迎高手点评:   核心代码:   package www.sjjjob.com.date;   import java.util.ArrayList; import java.util.Calendar; import java.util.List; /**  * 日期公共函数  * @author  shenjunjie  * @ver...
JS获取两个日期工作日相差的小时数(不包含周末)----可以指定一天的上班时间
//获取两个日期相差的工作小时(不包括节假日) function getHour(StartTime, EndTime) { StartTime = new Date(StartTime.replace(/-/g, '/')); EndTime = new Date(EndTime.replace(/-/g, '/')...
利用SQL统计时间时怎么去除周末的时间(非工作日时间),我需要的是工作时间.
将所有周六/周日/节假日放入表二中.if object_id(pubs..tb) is not null   drop table tbgocreate table tb(Dept_ID varchar(10),EmpNo   varchar(10),Start   datetime,tEnd    datetime)insert into tb(Dept_ID,EmpNo,Sta
java工作日计算(去除法定假日)
java工作日计算(去除法定假日) 计算偏移量,单独TXT文件存储法定假日;
java计算整年工作日(包含特殊的工作日)排除法定节假日和周末能运行
java计算整年工作日(包含特殊的工作日)排除法定节假日和周末能运行
c++ 计算2个日期相差天数,去除节假日和周末
// Calctime.cpp : 定义控制台应用程序的入口点。//#include &quot;stdafx.h&quot;#include &amp;lt;iostream&amp;gt;#include &amp;lt;cmath&amp;gt;#include &amp;lt;string&amp;gt;#include &amp;lt;vector&amp;gt;#include &amp;lt;sstream&amp;gt; using namespace std;struct Da...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 我学习的是java 怎么把python学好