获取俩个时间段的最终结束时间(去掉周六日的有效结束时间)

/**
	 * 获取俩个时间段的最终结束时间(去掉周六日的有效结束时间)
	 * 
	 * @param startTime 开始时间
	 * @param endTime  结束时间
	 * @return
	 */
	public static Date validEndTime(Date startTime, Date endTime) {
		// 中间有多少天是周末
		int leaveDays = 0;
		// 开始日期
		Calendar startCal = Calendar.getInstance();
		// 结束时间
		Calendar endCal = Calendar.getInstance();
		// 从startTime开始循环遍历每个日期,若该日期不是周六日则天数+1
		while (startTime.compareTo(endTime) != 1) {
			startCal.setTime(startTime);
			endCal.setTime(endTime);
			// 判断是否为周六日
			int week = startCal.get(Calendar.DAY_OF_WEEK) - 1;
			if (week == 0 || week == 6) {// 0为周日,6为周六
				// 跳出循环进入下一个日期
				startCal.add(Calendar.DAY_OF_MONTH, +1);
				// 结束时间+1
				endCal.add(Calendar.DAY_OF_MONTH, +1);
				endTime = endCal.getTime();
				startTime = startCal.getTime();
				// 是节假日或者周末,天数+1
				leaveDays = leaveDays + 1;
				continue;
			}
			// 日期往后加一天
			startCal.add(Calendar.DAY_OF_MONTH, +1);
			startTime = startCal.getTime();
		}
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
		System.out.println("有效结束时间:" + df.format(endTime));
		System.out.println("周末天数:" + leaveDays + "天");
		return endTime;
	}

节假日接口:http://api.goseek.cn/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要求多个时间段的并集,可以先将所有时间段按照起始时间点进行排序,然后遍历所有时间段,将重叠的时间段合并成一个新的时间段,直到遍历完所有时间段为止。 具体实现可以使用std::sort()对时间段进行排序,然后使用一个std::vector<TimeRange>来存储合并后的时间段。对于每个时间段,可以判断它是否与当前已合并的时间段有重叠,如果有则将其合并。最后,遍历所有合并后的时间段,输出每一段时间的起始时间点和结束时间点即可。 以下是一个示例代码: ```c++ #include <iostream> #include <algorithm> #include <vector> struct TimeRange { time_t start; time_t end; }; // 定义比较函数,用于sort排序 bool operator<(const TimeRange& a, const TimeRange& b) { return a.start < b.start; } // 合并时间段 std::vector<TimeRange> merge_time_ranges(const std::vector<TimeRange>& time_ranges) { std::vector<TimeRange> merged_ranges; for (const auto& range : time_ranges) { if (merged_ranges.empty()) { merged_ranges.push_back(range); } else { auto& last_range = merged_ranges.back(); if (range.start <= last_range.end) { last_range.end = std::max(last_range.end, range.end); } else { merged_ranges.push_back(range); } } } return merged_ranges; } int main() { std::vector<TimeRange> time_ranges = { {time(nullptr), time(nullptr) + 3600}, // 1小时 {time(nullptr) + 1800, time(nullptr) + 5400}, // 1.5小时 {time(nullptr) + 7200, time(nullptr) + 10800} // 3小时 }; // 按照起始时间点排序 std::sort(time_ranges.begin(), time_ranges.end()); // 合并时间段 auto merged_ranges = merge_time_ranges(time_ranges); // 输出合并后的时间段 for (const auto& range : merged_ranges) { std::cout << "Start Time: " << range.start << ", End Time: " << range.end << "\n"; } return 0; } ``` 在上面的示例代码中,我们使用了一个函数merge_time_ranges()来合并时间段。在合并过程中,我们使用了一个std::vector<TimeRange>来存储合并后的时间段。对于每个时间段,我们判断它是否与当前已合并的时间段有重叠,如果有则将其合并,否则将其添加到合并后的时间段中。最后,我们遍历所有合并后的时间段,输出每一段时间的起始时间点和结束时间点。 需要注意的是,在实际使用中,时间表示方式可能会不同,需要根据实际情况进行相应的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值