请假时间计算(基本的)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 请假计算(小时)
 * 1.除去 节假日
 * 2.除去 非工作时间(一般是周六周日)
 * 3.除去 其他规定的 非工作时间(有具体的  实行者指定)
 * 4.考虑一点 其他不上班时间 有些公司的特别
 * 5.只考虑请假在上班时间段 不考虑早晨上班之前 和 晚上下班之后
 * @author fengjing
 *
 */
public class Qingjia_jiSuan {

	/**
	* 节假日查询接口
	* 使用方法 url+yyyyMMdd
	*/
	public static final String goSeekURL= "http://api.goseek.cn/Tools/holiday?date=";
	
	//时间格式化
	public final static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	
	/**
	 * 从公认网站上获取 节假日信息
	 * @param url 获取节假日的 公认网站 url="网站地址"+时间 时间格式yyyyMMdd
	 * @param url
	 * @return 工作日对应结果为 0, 休息日对应结果为 1, 节假日对应的结果为 2, 网站失效-1, 数据格式改变-2
	 */
	public static String getHoliday(String url){
		URL urlTime;
		String json = "";
		try {
			urlTime = new URL(url);
		
			HttpURLConnection connection;
			try {
				connection = (HttpURLConnection) urlTime.openConnection();//打开连接
				BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));//获取输入流
				StringBuilder sb = new StringBuilder();
				String line;
				while ((line = br.readLine()) != null) {//循环读取流
					sb.append(line);
				}
				br.close();//关闭流
				connection.connect();//连接会话
				json = sb.toString();
				if(json.contains("data")){
					//System.out.println(json.substring(json.length()-2,json.length()-1));
					return json.substring(json.length()-2,json.length()-1);
				}else{
					return "-2";
				}
			} catch (IOException e) {
				return "-1";
			}
		} catch (MalformedURLException e) {
			return "-1";
		}
	}
	
	/**
	* 判断某年某月有多少天
	* @param year 年  "yyyy"
	* @param moun 月 "m"
	* @return
	*/
	public static int daysMonth(int year,int moun){
		switch(moun){
			case 0: return 31;
			case 1: return ((year%4==0&&year%100!=0)||year%400==0)?29:28;
			case 2: return 31;
			case 3: return 30;
			case 4: return 31;
			case 5: return 30;
			case 6: return 31;
			case 7: return 31;
			case 8: return 30;
			case 9: return 31;
			case 10: return 30;
			case 11: return 31;
			default: return 0;
		}
	}
	/**
	* 通过时间秒毫秒数判断两个时间的间隔
	* @param tiny 开始时间
	* @param large结束时间
	* @return 返回几天
	*/
	public static int differentDaysByMillisecond(Date tiny,Date large){
		int days = (int) ((large.getTime() - tiny.getTime()) / (1000*3600*24));
		return days;
	}
	
	/**
	* 通过时间秒毫秒数判断两个时间的间隔
	* @param tiny 开始时间
	* @param large结束时间
	* @return 返回几小时
	*/
	public static double differentHoursByMillisecond(Date tiny,Date large){
		double hours = ((double) ((large.getTime() - tiny.getTime())) / (1000*3600));
		return hours;
	}
	
	/**
	* 时间格式yyyy-MM-dd HH:mm:ss
	* @param start 请假开始时间 yyyy-MM-dd HH:mm:ss
	* @param end 请假结束时间 yyyy-MM-dd HH:mm:ss
	* @param startM 上班早晨开始时间 HH:mm:ss
	* @param endE   上班早晨结束时间 HH:mm:ss
	* @param startAf 上班下午开始时间 HH:mm:ss
	* @param endAf      上班下午结束时间 HH:mm:ss
	* @return
	*/
	public int calculateTimeHour(String start,String end,String startM,String endE,String startAf,String endAf){
		if(start!=null&&end!=null&&startM!=null&&endE!=null&&startAf!=null&&endAf!=null){//确保时间格式正确和值存在
			try {
				Date dataStart = Qingjia_jiSuan.format.parse(start);
				Date dataEnd = Qingjia_jiSuan.format.parse(end);
	
				double hours = 0;
				int monthDays = -1;
				int yearTime = dataStart.getYear()+1900;
				int mounthTime = dataStart.getMonth();
				int dataTime = dataStart.getDate();
				
				double lunchBreak = differentHoursByMillisecond(Qingjia_jiSuan.format.parse("2017"+"-01-"+"01 "+endE),Qingjia_jiSuan.format.parse("2017"+"-01-"+"01 "+startAf));
				int interval = Qingjia_jiSuan.differentDaysByMillisecond(dataStart,dataEnd);
	
				//判断这年这月有多少天
				monthDays = Qingjia_jiSuan.daysMonth(yearTime,mounthTime);
				//第一天请假开始时间
				String startday = start.substring(start.lastIndexOf(" ")+1,start.length()-1);
				//最后一天请假结束时间
				String endday = end.substring(end.lastIndexOf(" ")+1,end.length()-1);
				double totalDay = 0;//累积总共请假多少天
				for(int i=0;i<=interval;i++){
					if(interval==0){//间隔0天 也就是 请假在一天之内
						hours = differentHoursByMillisecond(dataStart,dataEnd);
					}else{//间隔超过一天
						dataTime +=(i==0?0:1);
						if(dataTime>monthDays){
							mounthTime ++;
							dataTime=1;
							if(mounthTime>11){
								yearTime++;
								mounthTime=0;
								dataTime=1;
							}
							monthDays = Qingjia_jiSuan.daysMonth(yearTime,mounthTime);
						}
					
						//判断是否是节假日
						if(!"0".equals(Qingjia_jiSuan.getHoliday(Qingjia_jiSuan.goSeekURL+yearTime+(((mounthTime+1))>=10?(mounthTime+1):"0"+(mounthTime+1))+(dataTime>10?dataTime:"0"+dataTime)))){
							System.out.println(""+yearTime+(((mounthTime+1))>10?(mounthTime+1):"0"+(mounthTime+1))+(dataTime>10?dataTime:"0"+dataTime)+"非工作日期不需要计算");
							continue;
						}
					
						dataStart = Qingjia_jiSuan.format.parse(yearTime+"-"+(((mounthTime+1))>=10?(mounthTime+1):"0"+(mounthTime+1))+"-"+(dataTime>=10?dataTime:"0"+dataTime)+" "+(i==0?startday:startM));
						dataEnd = Qingjia_jiSuan.format.parse(yearTime+"-"+(((mounthTime+1))>=10?(mounthTime+1):"0"+(mounthTime+1))+"-"+(dataTime>=10?dataTime:"0"+dataTime)+" "+(i==interval?endday:endAf));
						hours = differentHoursByMillisecond(dataStart,dataEnd);
						if(i==interval){//判断最后一天是否超过午休
							if(endday.compareTo(startAf)<0){
								lunchBreak = 0;
							}
						}
					}
					System.out.println(yearTime+"-"+(((mounthTime+1))>10?(mounthTime+1):"0"+(mounthTime+1))+"-"+(dataTime>10?dataTime:"0"+dataTime)+" 请假:"+(hours-lunchBreak)+"小时");
					totalDay+=hours-lunchBreak;
				}
				System.out.println(totalDay(totalDay));
			} catch (ParseException e) {
				e.printStackTrace();
			}
		}
		return 0;
	}

	/**
	 * 累积请假共多少天
	 * @param totalDay
	 * @return totalDay < 24小时按小时算   totalDay >= 24小时按天算
	 */
	public String totalDay(double totalDay){
		if(totalDay > 24){
			return (totalDay/24) + "天";
		}else{
			return totalDay + "小时";
		}
	}
	
	public static void main(String args[]) throws IOException{
		Qingjia_jiSuan qj= new Qingjia_jiSuan();
		//测试
		qj.calculateTimeHour("2019-06-01 09:30:00","2019-07-09 12:00:00","09:00:00","12:00:00","13:00:00","17:30:00");
	}
}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
好的,这是一个比较复杂的项目,需要设计一个员工数据管理系统和计算工资的程序。我来为你分步骤设计该程序。 1. 设计员工数据管理系统 首先,我们需要设计一个员工数据管理系统,用于记录员工的基本信息、工作时间、加班时间请假时间等数据。我们可以使用Java类来实现这个系统,每一个员工都是一个对象,每个对象包含员工的基本信息(如姓名、工号、部门、级别等)以及工作时间、加班时间请假时间等属性。可以考虑以下类: ``` //员工类 public class Employee { private String name; //姓名 private int number; //工号 private String department; //部门 private String level; //级别 private int workTime; //工作时间 private int overtime; //加班时间 private int leave; //请假时间 //构造函数 public Employee(String name, int number, String department, String level) { this.name = name; this.number = number; this.department = department; this.level = level; this.workTime = 0; this.overtime = 0; this.leave = 0; } //getter和setter方法 //... } ``` 然后,我们需要一个集合类,用于存储所有员工的信息,可以考虑使用ArrayList类。 ``` //员工管理类 import java.util.ArrayList; public class EmployeeManager { private ArrayList<Employee> employees; //构造函数 public EmployeeManager() { employees = new ArrayList<>(); } //添加员工 public void addEmployee(Employee employee) { employees.add(employee); } //删除员工 public void removeEmployee(Employee employee) { employees.remove(employee); } //获取所有员工 public ArrayList<Employee> getAllEmployees() { return employees; } //根据工号查找员工 public Employee findEmployee(int number) { for (Employee employee : employees) { if (employee.getNumber() == number) { return employee; } } return null; } //... } ``` 2. 计算工资 基本工资和加班费的计算可以通过员工的级别和工作时间来确定。请假扣工资也可以根据请假时间和员工级别来计算。实习生的工资则按小时计算。 我们可以为Employee类添加计算工资的方法: ``` //员工类 public class Employee { //... //计算工资 public int calculateSalary() { int salary = 0; //计算基本工资 switch (level) { case "A": salary = 10000; break; case "B": salary = 8000; break; case "C": salary = 5000; break; default: break; } //计算加班费 if (workTime > 40) { salary += (workTime - 40) * 100; } //计算请假扣工资 if (salary > 0 && leave > 0) { int leaveSalary = leave * 80; if (leaveSalary >= salary) { salary = 0; } else { salary -= leaveSalary; } } return salary; } } ``` 对于实习生,我们可以设计一个子类,重写calculateSalary方法: ``` //实习生类 public class Intern extends Employee { private int hourlySalary; //小时工资 //构造函数 public Intern(String name, int number, String department, String level, int hourlySalary) { super(name, number, department, level); this.hourlySalary = hourlySalary; } //计算工资 @Override public int calculateSalary() { return workTime * hourlySalary; } } ``` 3. 测试程序 最后,我们需要编写一个测试程序,用于模拟生成员工打卡数据,并计算工资和汇总数据。这个测试程序可以包含以下功能: - 添加员工 - 模拟生成员工打卡数据 - 计算每个员工的工资 - 统计每个员工的工作时间、加班时间请假时间 - 统计最勤奋的和最偷懒的员工 ``` public class Test { public static void main(String[] args) { //创建员工管理类 EmployeeManager employeeManager = new EmployeeManager(); //添加员工 employeeManager.addEmployee(new Employee("张三", 1001, "人事部", "A")); employeeManager.addEmployee(new Employee("李四", 1002, "财务部", "B")); employeeManager.addEmployee(new Intern("王五", 1003, "市场部", "C", 50)); //模拟生成员工打卡数据 for (Employee employee : employeeManager.getAllEmployees()) { int workTime = (int) (Math.random() * 10 + 30); //30-39小时 int overtime = (int) (Math.random() * 10); //0-9小时 int leave = (int) (Math.random() * 5); //0-4小时 employee.setWorkTime(workTime); employee.setOvertime(overtime); employee.setLeave(leave); } //计算工资,统计数据 int totalWorkTime = 0; int totalOvertime = 0; int totalLeave = 0; for (Employee employee : employeeManager.getAllEmployees()) { int salary = employee.calculateSalary(); System.out.println(employee.getName() + "的工资为:" + salary); totalWorkTime += employee.getWorkTime(); totalOvertime += employee.getOvertime(); totalLeave += employee.getLeave(); } System.out.println("总工作时间:" + totalWorkTime); System.out.println("总加班时间:" + totalOvertime); System.out.println("总请假时间:" + totalLeave); //统计最勤奋和最偷懒的员工 Employee hardestWorkingEmployee = null; Employee laziestEmployee = null; int maxWorkTime = 0; int minWorkTime = Integer.MAX_VALUE; for (Employee employee : employeeManager.getAllEmployees()) { if (employee.getWorkTime() > maxWorkTime) { hardestWorkingEmployee = employee; maxWorkTime = employee.getWorkTime(); } if (employee.getWorkTime() < minWorkTime) { laziestEmployee = employee; minWorkTime = employee.getWorkTime(); } } System.out.println("最勤奋的员工:" + hardestWorkingEmployee.getName()); System.out.println("最偷懒的员工:" + laziestEmployee.getName()); } } ``` 这个测试程序可以输出每个员工的工资,以及统计数据和最勤奋和最偷懒的员工。你可以根据需要进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值