java根据给定的小时数,计算工作日最后结束时间

一个朋友给的小题目,不包含节假日期,只算星期六和星期日是休息时间即可.

 

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();
	}
}


如果有更好的实现方法希望大家跟帖,我会虚心接受再教育..哈哈

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对于给定工作时间工作日和节假日,我们可以使用Java计算出最终的截止日期时间。 首先,我们需要确定工作日和节假日的日期列表。可以通过读取配置文件或从数据库中获取这些日期。我们可以使用一个List或Set数据结构来保存这些日期。 接下来,我们需要确定工作日的起始时间结束时间。假设工作日的起始时间为9:00AM(即早上9点), 结束时间为5:00PM(即下午5点)。我们可以使用Java的LocalTime类来表示时间。然后,我们可以计算出每个工作日的有效工作时间,即结束时间减去起始时间。 然后,我们需要获取给定工作时间的起始日期时间以及所需工作小时数。我们可以使用Java的LocalDateTime类来表示日期时间。 接下来,我们可以根据给定工作开始时间,将其转换为下一个最近的工作日开始时间。如果给定工作开始时间工作日内,则保持不变。如果给定工作开始时间在非工作日,则将其转换为下一个最近的工作日开始时间。可以使用Java的DayOfWeek类来判断给定日期是周几。 然后,我们需要计算剩余的工作小时数,并根据工作时间的起止时间,减去非工作时间和节假日。我们可以使用Java的Duration类来计算时间差。 最后,根据剩余的工作小时数计算出截止日期时间。我们可以根据工作日的有效工作时间(即结束时间减去起始时间)和剩余工作小时数,确定所需的工作日数。然后,我们可以根据这个工作日数和工作时间结束时间计算出截止日期日期时间。 在计算过程中,还需要考虑特殊情况,比如给定工作时间已经超过了截止日期工作时间跨越了多个工作日等。我们可以使用循环和条件语句来处理这些情况。 总之,通过使用Java日期时间相关的类和方法,结合计算和判断逻辑,我们可以很方便地计算给定工作时间的最终截止日期时间
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值