자바 근무 시간 계산 공휴일 및 휴일 제외
10457 단어 자바시간 을 계산 하 다
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;
import java.util.LinkedList;
import java.util.List;
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 = 5;//
long milsecPerDay = 1000*60*60*24;//
float hoursPerWeek = hoursPerDay*daysPerWeek;//
public float calculateHours(String beginTime, String endTime){
//
Date t1 = stringToDate(beginTime);//
Date t2 = stringToDate(endTime);//
//
t1 = processBeginTime(t1);
t2 = processEndTime(t2);
// , 0
if(t1.getTime()>t2.getTime()){
return 0;
}
//
int weekCount = (int) ((t2.getTime()-t1.getTime())/(milsecPerDay*7));
float totalHours = 0;
totalHours += weekCount * hoursPerWeek;
// ,
t2.setTime(t2.getTime()-weekCount*7*milsecPerDay);
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++;
}
}
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);
}
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);
}
if(t.getDay()==6){
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);
}if(t.getDay()==6){
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;
}
}
/**
*
* @param beginTime
* @param endTime
* @return
* @throws ParseException
*/
public static float CalculateHour(String beginTime,String endTime) throws ParseException{
CalculateHours ch = new CalculateHours();
float a=ch.calculateHours(beginTime, endTime);
Calendar startDay = Calendar.getInstance();
Calendar endDay = Calendar.getInstance();
startDay.setTime(FORMATTER.parse(beginTime));
endDay.setTime(FORMATTER.parse(endTime));
String[] workday=printDay(startDay, endDay);
String[] holiday = new String[]{"01-01","01-02","01-03","05-01","05-02","05-03","10-01","10-02",
"10-03","10-04","10-05","10-06","02-08","02-09","02-10"};
Calendar now = Calendar.getInstance();
int year=now.get(Calendar.YEAR); //
List<String> list = new ArrayList<String>();
for (String string : holiday) {
string=year+"-"+string;
list.add(string);
}
String[] arr = list.toArray(new String[0]);
int holidays = arrContrast(workday, arr);
int holidayHous=holidays*8;
float b = (float)(Math.round(a*10))/10;
float workHours=b-holidayHous;
return workHours;
}
public static void main(String[] args) throws ParseException {
String beginTime = "2018-6-1 9:00:00";
String endTime = "2018-6-4 10:10:00";
CalculateHours ch = new CalculateHours();
float b=ch.calculateHours(beginTime, endTime);
System.out.println(b);
float a=CalculateHours.CalculateHour(beginTime, endTime);
System.out.println(a);
}
/**
*
* @param arr1
* @param arr2
* @return
*/
private static int arrContrast(String[] arr1, String[] arr2){
int count=0;
List<String> list = new LinkedList<String>();
for (String str : arr1) { // ,list 1,2,3,4
if (!list.contains(str)) {
list.add(str);
}
}
for (String str : arr2) { // ,
if(list.contains(str)){
list.remove(str);
++count;
}
}
return count;
}
private static final DateFormat FORMATTER = new SimpleDateFormat("yyyy-MM-dd");
private static String[] printDay(Calendar startDay, Calendar endDay) {
List<String> list = new ArrayList<String>();
//
if (startDay.compareTo(endDay) >= 0) {
return new String[]{};
}
//
Calendar currentPrintDay = startDay;
while (true) {
//
currentPrintDay.add(Calendar.DATE, 1);
// ,
if (currentPrintDay.compareTo(endDay) == 0) {
break;
}
list.add(FORMATTER.format(currentPrintDay.getTime()));
}
String[] arr = list.toArray(new String[0]);
return arr;
}
}
main 방법의 실행 결 과 는 다음 과 같 습 니 다.코드 에 주석 이 있어 서 필요 에 따라 스스로 조절 할 수 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.