package com.fiberhome.fibergen.util;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class MyDate {
private static double amStartTime = 8.500;
private static double amEndTime = 12.000;
private static double pmStartTime = 14.000;
private static double pmEndTime = 17.500;
public static void main(String[] args) throws ParseException {
String starttime="2021-03-20 11:00:10";
String endtime="2021-03-20 12:30:10";
// System.out.println(1.50/8.00);
// double data =n.jisuan(starttime, endtime);
// data = data * 8;
// BigDecimal b = new BigDecimal(data);
// data = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
// System.out.println(data);
Date startDate = DateUtils.parseDate(starttime);
try {
System.out.println(new MyDate().getOverWorkDays(starttime,endtime));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 计算请假时间
* @param starttime
* @param endtime
* @return
* @throws Exception
*/
public double getDays(String starttime ,String endtime) throws Exception{
double data = 0;
data = jisuan(starttime, endtime);
data = data * 8;
BigDecimal b = new BigDecimal(data);
data = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
return data;
}
public double jisuan(String s1 ,String s2) throws ParseException{
SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d1 = s.parse(s1);
Date d2 = s.parse(s2);
SimpleDateFormat ss = new SimpleDateFormat("yyyy-MM-dd");
Date dd1 = ss.parse(s1);
Date dd11 = ss.parse(s1);
Date dd2 = ss.parse(s2);
// System.out.println(dd1);
Calendar ca = Calendar.getInstance();
if(dd1.getTime()==dd2.getTime()){//同一天
if(this.getweekdayloc(dd1,ca)==0){//星期天
return 0;
}else{
return this.getshijian(d1,ca)) - this.getshijian(d2,ca);
}
}else{
double bb=0.000;
while(dd2.getTime()>=dd1.getTime()){
if(this.getweekdayloc(dd1,ca)==1){
if(dd1.getTime()==dd11.getTime()){
bb+=this.getshijian(d1,ca);
}else if(dd1.getTime()==dd2.getTime()){
bb+=(1-this.getshijian(d2,ca));
}else{
bb+=1;
}
}
ca.setTime(d1);
ca.add(Calendar.DATE, 1);
d1=ca.getTime();
ca.clear();
ca.setTime(dd1);
ca.add(Calendar.DATE, 1);
dd1=ca.getTime();
// System.out.println(bb);
}
return bb;
}
}
//传进一个日期判断是否是周六、日 。六日返回0,其他返回1
private int getweekdayloc(Date date,Calendar ca){
ca.setTime(date);
if(ca.get(Calendar.DAY_OF_WEEK)==1 || ca.get(Calendar.DAY_OF_WEEK)==7){
return 0;
}else{
return 1;
}
}
//判断
private double getshijian(Date date,Calendar ca){
ca.setTime(date);
int shi = ca.get(Calendar.HOUR_OF_DAY);
int fen = ca.get(Calendar.MINUTE);
double d = shi+fen/60.000;
if(shi<amStartTime){
return 1.000;
}else if(d<=amEndTime && d>=amStartTime){
return (amEndTime-d+(pmEndTime-pmStartTime))/8;
}else if(d>amEndTime && d<pmStartTime){
return (pmEndTime-pmStartTime)/8;
}else if(d>=pmStartTime&& d<=pmEndTime){
return (pmEndTime-d)/8;
}else{
return 0.000;
}
}
/**
*
* @param startTime
* @param endTime
* @param flag flag按照二进制位数分别为00(0两个都在周末),01(1开始在,结尾不在),10(2,开始不在,结尾在),11(3,两个都不在)
* @return
*/
public double getOverWorkDays(Date startTime, Date endTime,int flag,boolean ifSameDay) {
double data = 0.0;
//1,当天下午至当天晚上
Calendar endInstance = Calendar.getInstance();
endInstance.setTime(endTime);
Calendar startInstance = Calendar.getInstance();
startInstance.setTime(startTime);
int endHours = endInstance.get(Calendar.HOUR_OF_DAY);
int intStart = startInstance.get(Calendar.HOUR_OF_DAY) +startInstance.get(Calendar.MINUTE)/60;
int ineEnd = endInstance.get(Calendar.HOUR_OF_DAY) +endInstance.get(Calendar.MINUTE)/60;
if(ifSameDay ){
if(flag == 3){
if(intStart <= pmEndTime) resetStartTime(startInstance);
}else{}
}else{
if(flag == 3){
if(intStart <= pmEndTime) resetStartTime(startInstance);
if(ineEnd >= amStartTime) resetEndTime(endInstance);
}
}
data = (endInstance.getTime().getTime() - startInstance.getTime().getTime())/1000.0/3600.0;
/*if(intStart >= pmEndTime){//在下班之后
}else{//在下班之前,强制置为下班时间
data = (endTime.getTime() - startInstance.getTime().getTime())/1000.0/3600.0;
}*/
//2,当天下午至第二天早上
BigDecimal b = BigDecimal.valueOf(data);
data = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
return data;
//3,双休
}
private void resetStartTime(Calendar startInstance) {
startInstance.set(Calendar.HOUR_OF_DAY,17);
startInstance.set(Calendar.MINUTE,30);
startInstance.set(Calendar.SECOND,0);
}
private void resetEndTime(Calendar endInstance) {
endInstance.set(Calendar.HOUR_OF_DAY,8);
endInstance.set(Calendar.MINUTE,30);
endInstance.set(Calendar.SECOND,0);
}
/**
* 计算加班时间
* @param s1
* @param s2
* @return
* @throws Exception
*/
public double getOverWorkDays(String s1, String s2) throws Exception{
double data = 0.0;
SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d1 = s.parse(s1);
Date d2 = s.parse(s2);
SimpleDateFormat ss = new SimpleDateFormat("yyyy-MM-dd");
Date dd1 = ss.parse(s1);
Date dd11 = ss.parse(s1);
Date dd2 = ss.parse(s2);
Calendar ca = Calendar.getInstance();
if(dd1.getTime()==dd2.getTime()){//同一天
if(this.getweekdayloc(dd1,ca)==0){//周末
data = (d2.getTime() - d1.getTime())/1000.0/3600.0;
}else{
return getOverWorkDays(d1,d2,3,true);
}
}else{//不同天
if(this.getweekdayloc(dd1,ca)==0 &&this.getweekdayloc(dd2,ca)==0 ){//首尾都是周末
data = (d2.getTime() - d1.getTime())/1000.0/3600.0;
}else if (this.getweekdayloc(dd1,ca)!=0 &&this.getweekdayloc(dd2,ca)!=0 ){
return getOverWorkDays(d1,d2,3,false);
}
}
BigDecimal b = BigDecimal.valueOf(data);
data = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
return data;
}
}
中间还有剩余的判断,留待你们自己去处理逻辑,比较粗糙,还请各位大佬多多指教