一个朋友给的小题目,不包含节假日期,只算星期六和星期日是休息时间即可.
package test;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class StringTest {
/**
* 给你一个日期时间
*
* [17:19] 加上一个小时数
*
* [17:19] 例如
*
* [17:21] 2011-7-25 16:00:00,然后工作时限是50个小时,你算出来,结束时间是多少
*
* [17:21] 当然,一天工作8个小时,而且还得减去周六日
*/
//格式化日期参数
private static final String formatStrYYYY_MM_DD_HH_mm_ss = "yyyy-MM-dd HH:mm:ss";
private static final String formatStrYYYY_MM_DD = "yyyy-MM-dd";
// 此方法返回 date时间
public Date fromDateStringToDate(String inVal, String formatString) {
SimpleDateFormat inputFormat = new SimpleDateFormat(formatString);
try {
return inputFormat.parse(inVal); // 将字符型转换成日期型
} catch (Exception e) {
e.printStackTrace();
return new Date();
}
}
// 此方法返回String 时间
public String fromDateStringToString(Date date, String formatString) {
SimpleDateFormat inputFormat = new SimpleDateFormat(formatString);
return inputFormat.format(date); // 返回毫秒数
}
public int getWeekDayString(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
return dayOfWeek;
}
public static void main(String[] args) {
StringTest df = new StringTest();
// 开始时间
Date startT = df.fromDateStringToDate("2011-08-22 07:40:00", formatStrYYYY_MM_DD_HH_mm_ss);
//Date startT = new Date();
Integer countSecond = 10 * 3600; // 工作时限(秒)
Integer countToDaySecond = 8 * 3600; // 一个工作时限(秒)
long ss = 0l;// 开始时限
// 如果工作时限大于 开始时限就代表时间有效
if (countSecond > ss) {
int forNumber = (int) (countSecond / countToDaySecond) + 1; // 循环次数
for (int i = 0; i < forNumber; i++) {
String today = df.fromDateStringToString(startT,
formatStrYYYY_MM_DD);
//如果第一次时间再该范围内,加一层循环数;注意的是:第一次计算时间是下班时间(18:00:00后)移到明天算
Date when1_1 = df.fromDateStringToDate(today + " 16:59:59",
formatStrYYYY_MM_DD_HH_mm_ss);
if (startT.after(when1_1)) {
forNumber = forNumber + 1;
}
String str[] = today.split("-");
// 今天星期几
int weekDay = df.getWeekDayString(startT);
switch (weekDay) {
case 1:
System.out.println("今天:" + df.setSixAndSever(weekDay)
+ " 休息!");
forNumber = forNumber + 1;
startT = df.nextDate(startT);
break;
case 2:
countSecond = df.setOneAndFive(startT, countSecond, str,
weekDay, forNumber);
startT = df.nextDate(startT);
break;
case 3:
countSecond = df.setOneAndFive(startT, countSecond, str,
weekDay, forNumber);
startT = df.nextDate(startT);
break;
case 4:
countSecond = df.setOneAndFive(startT, countSecond, str,
weekDay, forNumber);
startT = df.nextDate(startT);
break;
case 5:
countSecond = df.setOneAndFive(startT, countSecond, str,
weekDay, forNumber);
startT = df.nextDate(startT);
break;
case 6:
countSecond = df.setOneAndFive(startT, countSecond, str,
weekDay, forNumber);
startT = df.nextDate(startT);
break;
case 7:
System.out.println("今天:" + df.setSixAndSever(weekDay)
+ " 休息!");
forNumber = forNumber + 1;
startT = df.nextDate(startT);
break;
}
}
}
}
public Integer setOneAndFive(Date date, Integer time,
String[] str, int weekDay, int forNumber) {
// 设置毫秒数为0返回时间
date = getDateByCalendar(date);
// 不包含时分秒的日期
String today = fromDateStringToString(date, formatStrYYYY_MM_DD);
// 每天格式化成String的时间
String fistStr = fromDateStringToString(date, "yyyy-MM-dd 08:00:00");
// 一天分上下午,一个半天为 (秒)
Integer half = 4 * 3600;
Integer all = 8 * 3600;
String endStr = "";
//判断每次日期范围,
Date when1 = fromDateStringToDate(today + " 18:00:00",
formatStrYYYY_MM_DD_HH_mm_ss);
Date when1_1 = fromDateStringToDate(today + " 17:59:59",
formatStrYYYY_MM_DD_HH_mm_ss);
Date when2 = fromDateStringToDate(today + " 13:59:59",
formatStrYYYY_MM_DD_HH_mm_ss);
Date when2_1 = fromDateStringToDate(today + " 14:00:00",
formatStrYYYY_MM_DD_HH_mm_ss);
Date when3 = fromDateStringToDate(today + " 12:00:00",
formatStrYYYY_MM_DD_HH_mm_ss);
Date when3_1 = fromDateStringToDate(today + " 11:59:59",
formatStrYYYY_MM_DD_HH_mm_ss);
Date when4 = fromDateStringToDate(today + " 07:59:59",
formatStrYYYY_MM_DD_HH_mm_ss);
Date when5 = fromDateStringToDate(today + " 00:00:00",
formatStrYYYY_MM_DD_HH_mm_ss);
String strPrintln = "";
if (date.after(when2) && date.before(when1)) {
// 当前下午必须工作时间(14:00:00-18:00:00)
Integer interval = (int) ((when1.getTime() - date.getTime()) / 1000);// 秒
fistStr = fromDateStringToString(date, formatStrYYYY_MM_DD_HH_mm_ss);
// 去掉下午必须工作时间
int temp = time - interval;
if (temp > 0l) {
// 如果剩下的时间大于下午上班的时间,那就减去时间差,留到明天算
time = time - interval;
endStr = fromDateStringToString(when1,
formatStrYYYY_MM_DD_HH_mm_ss);
} else {
// 如果时间再下午的范围内,就算当前时间差
date = new Date(date.getTime() + time * 1000);
endStr = fromDateStringToString(date,
formatStrYYYY_MM_DD_HH_mm_ss);
time = 0;
}
strPrintln = "今天是" + str[0] + "年" + str[1] + "月" + str[2] + "日 "
+ setSixAndSever(weekDay) + " 上班时间:" + fistStr + " 下班时间:"
+ endStr;
} else if (date.after(when4) && date.before(when3)) {
// 当前上午必须工作时间(08:00:00-12:00:00)
Integer interval = (int) ((when3.getTime() - date.getTime()) / 1000);// 秒
fistStr = fromDateStringToString(date, formatStrYYYY_MM_DD_HH_mm_ss);
// 去掉上午必须工作时间
int temp = time - interval;
if (temp <= half && temp > 0l) {
// 如果剩下的时间再下午的范围内,把下午的计算时间为结束时间
date = new Date(when2_1.getTime() + (time - half) * 1000);
endStr = fromDateStringToString(date,
formatStrYYYY_MM_DD_HH_mm_ss);
time = 0;
} else if (temp <= 0l) {
// 如果没有剩下时间,那就减去最后的时间作为结束时间
date = new Date(date.getTime() + time * 1000);
endStr = fromDateStringToString(date,
formatStrYYYY_MM_DD_HH_mm_ss);
time = 0;
} else {
// 如果剩下的时间大于下午的时间,就减去下午的时间,把下午下班时间为结束时间
time = time - interval - half;
endStr = fromDateStringToString(when1,
formatStrYYYY_MM_DD_HH_mm_ss);
}
strPrintln = "今天是" + str[0] + "年" + str[1] + "月" + str[2] + "日 "
+ setSixAndSever(weekDay) + " 上班时间:" + fistStr + " 下班时间:"
+ endStr;
} else if (date.after(when5) && date.before(when4)) {
//该判断是说,第一次计算时间是08:00:00前(还不到上班时间),应该拿到08:00:00点这里开始算
// 当前上午必须工作时间(14:00:00-18:00:00)
Integer interval = (int) ((when3.getTime() - date.getTime()) / 1000);// 秒
// 去掉上午必须工作时间
int temp = time - interval;
if (temp <= half && temp > 0l) {
// 如果剩下的时间再下午的范围内,把下午的计算时间为结束时间
date = new Date(when2_1.getTime() + (time - half) * 1000);
endStr = fromDateStringToString(date,
formatStrYYYY_MM_DD_HH_mm_ss);
time = 0;
} else if (temp <= 0l) {
// 如果没有剩下时间,那就减去最后的时间作为结束时间
date = new Date(date.getTime() + time * 1000);
endStr = fromDateStringToString(date,
formatStrYYYY_MM_DD_HH_mm_ss);
time = 0;
} else {
// 如果剩下的时间大于下午的时间,就减去下午的时间,把下午下班时间为结束时间
time = time - all;
endStr = fromDateStringToString(when1,
formatStrYYYY_MM_DD_HH_mm_ss);
}
strPrintln = "今天是" + str[0] + "年" + str[1] + "月" + str[2] + "日 "
+ setSixAndSever(weekDay) + " 上班时间:" + fistStr + " 下班时间:"
+ endStr;
} else if (date.after(when3_1) && date.before(when2_1)) {
// 当前时间是中午休息时间(12:00:00-14:00:00),拿到下午算
fistStr = fromDateStringToString(when2_1,
formatStrYYYY_MM_DD_HH_mm_ss);
// 去掉下午必须工作时间
int temp = time - half;
if (temp > 0l) {
// 如果剩下的时间大于下午上班的时间,那就减去时间差,留到明天算
time = time - half;
endStr = fromDateStringToString(when1,
formatStrYYYY_MM_DD_HH_mm_ss);
} else {
// 如果时间再下午的范围内,就算当前时间差
date = new Date(date.getTime() + time * 1000);
endStr = fromDateStringToString(date,
formatStrYYYY_MM_DD_HH_mm_ss);
time = 0;
}
strPrintln = "今天是" + str[0] + "年" + str[1] + "月" + str[2] + "日 "
+ setSixAndSever(weekDay) + " 上班时间:" + fistStr + " 下班时间:"
+ endStr;
} else if (date.after(when1_1)) {
//下午下班了,提示拿到明天再算
forNumber = forNumber + 1;
strPrintln = "今天是" + str[0] + "年" + str[1] + "月" + str[2] + "日 "
+ setSixAndSever(weekDay) + " 您指定的时间已经下班了!";
}
System.out.println(strPrintln);
return time;
}
public String setSixAndSever(int weekDay) {
final String dayNames[] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五",
"星期六" };
return dayNames[weekDay - 1];
}
/**
* 进入下一天
*/
@SuppressWarnings("deprecation")
public Date nextDate(Date date) {
date.setHours(8);
date.setMinutes(0);
date.setSeconds(0);
return (new Date(date.getTime() + 1 * 24 * 60 * 60 * 1000));
}
// 此方法返回 date时间
@SuppressWarnings("deprecation")
public static Date getDateByCalendar(Date date) {
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, date.getYear() + 1900);
c.set(Calendar.MONTH, date.getMonth());
c.set(Calendar.DAY_OF_MONTH, date.getDate());
c.set(Calendar.HOUR_OF_DAY, date.getHours());
c.set(Calendar.MINUTE, date.getMinutes());
c.set(Calendar.SECOND, date.getSeconds());
c.set(Calendar.MILLISECOND, 0);
return c.getTime();
}
}
如果有更好的实现方法希望大家跟帖,我会虚心接受再教育..哈哈