📄 calculator.java
字号:
package myBeans;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
public class Calculator{
//各时间区域
private int DAWN_BEGIN = 1;
private int DAWN_END = 5;
private int MORNING_BEGIN = 8;
private int MORNING_END = 12;
private int NOON_BEGIN = 14;
private int NOON_END = 18;
private int NIGHT_BEGIN = 20;
private int NIGHT_END = 24;
//各折算标准
private double DAWN_DISCOUNT = 1.5;
private double MORNING_DISCOUNT = 1;
private double NOON_DISCOUNT = 1;
private double NIGHT_DISCOUNT = 1.25;
private double WEEKEND_DISCOUNT = 1.25;
//各计时点
private int dawn_start_point = -1;
private int morning_start_point = -1;
private int noon_start_point = -1;
private int night_start_point = -1;
private int dawn_end_point = -1;
private int morning_end_point = -1;
private int noon_end_point = -1;
private int night_end_point = -1;
//分钟有时需要被抹去,因此作为属性便于控制
private int startMinute = 0;
private int endMinute = 0;
public double countTime(String recordDate, String startTime, String endTime){
double count = 0;
if(recordDate==null||recordDate.equals("")||startTime==null||startTime.equals("")||
endTime==null||endTime.equals("")){
System.out.println("input is(are) invalid!");
return 0;
}
//获取上下班的时,分点。
int startHour = Integer.parseInt(startTime.split("\\.")[0].trim());
startMinute = Integer.parseInt(startTime.split("\\.")[1].trim());
int endHour = Integer.parseInt(endTime.split("\\.")[0].trim());
endMinute = Integer.parseInt(endTime.split("\\.")[1].trim());
//将上下班时点放入正确时段
findStartPoint(startHour);
findEndPoint(endHour);
//确定好时间点以后,即可进行工时计算
count = calculate(recordDate);
System.out.println("count is:"+count);
return count;
}
//将上班时点放入正确时段,并保持分点在计算时的正确性
private void findStartPoint(int point){
if(point<DAWN_END){
if(point>=DAWN_BEGIN)
dawn_start_point = point;
else{
dawn_start_point = DAWN_BEGIN;
startMinute = 0;
}
return;
}
if(point<MORNING_END){
if(point>=MORNING_BEGIN)
morning_start_point = point;
else{
morning_start_point = MORNING_BEGIN;
startMinute = 0;
}
return;
}
if(point<NOON_END){
if(point>=NOON_BEGIN)
noon_start_point = point;
else{
noon_start_point = NOON_BEGIN;
startMinute = 0;
}
return;
}
if(point<NIGHT_END){
if(point>=NIGHT_BEGIN)
night_start_point = point;
else{
night_start_point = NIGHT_BEGIN;
startMinute = 0;
}
return;
}
}
//将下班时点放入正确时段,并保持分点在计算时的正确性
private void findEndPoint(int point){
if(point>=NIGHT_BEGIN){
if(point<NIGHT_END)
night_end_point = point;
else{
night_end_point = NIGHT_END;
endMinute = 0;
}
return;
}
if(point>=NOON_BEGIN){
if(point<NOON_END)
noon_end_point = point;
else{
noon_end_point = NOON_END;
endMinute = 0;
}
return;
}
if(point>=MORNING_BEGIN){
if(point<MORNING_END)
morning_end_point = point;
else{
morning_end_point = MORNING_END;
endMinute = 0;
}
return;
}
if(point>=DAWN_BEGIN){
if(point<DAWN_END)
dawn_end_point = point;
else{
dawn_end_point = DAWN_END;
endMinute = 0;
}
return;
}
}
private double calculate(String workDay){
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
Date date;
int dayOfWeek = 0;
try{
date = fmt.parse(workDay);
GregorianCalendar grc=new GregorianCalendar();
grc.setTime(date);
dayOfWeek = grc.get(GregorianCalendar.DAY_OF_WEEK);
} catch (Exception e){
e.printStackTrace();
}
//周末各时段均为1.25倍工资
if(dayOfWeek==1||dayOfWeek==7)
DAWN_DISCOUNT = MORNING_DISCOUNT = NOON_DISCOUNT = NIGHT_DISCOUNT = WEEKEND_DISCOUNT;
boolean flag = false;
double count = 0;
int top,bottom = 0;
if(dawn_start_point==-1&&!flag)
;
else{
flag = true;
if(dawn_start_point==-1)
top = DAWN_BEGIN*60;
else
top = dawn_start_point*60 - startMinute;
if(dawn_end_point==-1)
bottom = DAWN_END*60;
else {
bottom = dawn_end_point*60 + endMinute;
flag = false;
}
count = count + (bottom - top)*DAWN_DISCOUNT;
if(!flag)
return count;
}
if(morning_start_point==-1&&!flag)
;
else{
flag = true;
if(morning_start_point==-1)
top = MORNING_BEGIN*60;
else
top = morning_start_point*60 - startMinute;
if(morning_end_point==-1)
bottom = MORNING_END*60;
else {
bottom = morning_end_point*60 + endMinute;
flag = false;
}
count = count + (bottom - top)*MORNING_DISCOUNT;
if(!flag)
return count;
}
if(noon_start_point==-1&&!flag)
;
else{
flag = true;
if(noon_start_point==-1)
top = NOON_BEGIN*60;
else
top = noon_start_point*60 - startMinute;
if(noon_end_point==-1)
bottom = NOON_END*60;
else {
bottom = noon_end_point*60 + endMinute;
flag = false;
}
count = count + (bottom - top)*NOON_DISCOUNT;
if(!flag)
return count;
}
if(night_start_point==-1&&!flag)
;
else{
flag = true;
if(night_start_point==-1)
top = NIGHT_BEGIN*60;
else
top = night_start_point*60 + startMinute;
if(night_end_point==-1)
bottom = NIGHT_END*60;
else {
bottom = night_end_point*60 + endMinute;
flag = false;
}
count = count + (bottom - top)*NIGHT_DISCOUNT;
if(!flag)
return count;
}
return count;
}
//每次调用前应将各项参数清零
public void reset(){
//各时间区域
DAWN_BEGIN = 1;
DAWN_END = 5;
MORNING_BEGIN = 8;
MORNING_END = 12;
NOON_BEGIN = 14;
NOON_END = 18;
NIGHT_BEGIN = 20;
NIGHT_END = 24;
//各折算标准
DAWN_DISCOUNT = 1.5;
MORNING_DISCOUNT = 1;
NOON_DISCOUNT = 1;
NIGHT_DISCOUNT = 1.25;
WEEKEND_DISCOUNT = 1.25;
//各计时点
dawn_start_point = -1;
morning_start_point = -1;
noon_start_point = -1;
night_start_point = -1;
dawn_end_point = -1;
morning_end_point = -1;
noon_end_point = -1;
night_end_point = -1;
//分钟有时需要被抹去,因此作为属性便于控制
startMinute = 0;
endMinute = 0;
}
public static void main(String [] args){
/*SimpleDateFormat fmt = new SimpleDateFormat("yyyy/MM/dd");
Date date;
try{
date = fmt.parse("2008/05/25");
GregorianCalendar grc=new GregorianCalendar();
grc.setTime(date);
System.out.println(grc.get(GregorianCalendar.DAY_OF_WEEK));
} catch (Exception e){
e.printStackTrace();
}*/
Calculator cal = new Calculator();
cal.reset();
System.out.println(cal.countTime("2008/08/31", "04.00", "12.00"));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -