问题描述
编写一个函数,输入两个日期,返回这两个日期之间的工作日天数(即周一至周五的天数,不包括周末周六和周日)。
要求
- 函数应接受两个日期作为输入,格式为 YYYY-MM-DD。
- 函数应返回两个日期之间的工作日天数。
- 考虑公共假期的影响,提供一个公共假期列表,并排除这些假期。
示例输入
start_date = "2024-05-01"
end_date = "2024-05-31"
holidays = ["2024-05-25"] # 假设2024年5月25日是公共假期
示例输出
20 # 5月有21个工作日,5月25日是假期,所以是21-1=20
解决思路
解析日期:首先,我们需要解析输入的日期字符串,将其转换为可以进行日期计算的格式。
计算日期差:计算两个日期之间的天数差。
排除周末:遍历这两个日期之间的每一天,排除周六和周日。
考虑公共假期:在计算过程中,检查每一天是否是公共假期,如果是,则不计入工作日。
返回结果:最后,返回计算得到的工作日天数。
Python代码实现
from datetime import datetime, timedelta
def workdays_between_dates(start_date, end_date, holidays):
# 解析日期
start = datetime.strptime(start_date, "%Y-%m-%d")
end = datetime.strptime(end_date, "%Y-%m-%d")
# 将公共假期列表转换为日期对象
holidays = [datetime.strptime(date, "%Y-%m-%d") for date in holidays]
# 计算工作日
workdays = 0
current_day = start
while current_day <= end:
# 检查是否为周末或公共假期
if current_day.weekday() < 5 and current_day not in holidays:
workdays += 1
current_day += timedelta(days=1)
return workdays
# 示例使用
start_date = "2024-05-01"
end_date = "2024-05-31"
holidays = ["2024-05-25"]
print(workdays_between_dates(start_date, end_date, holidays)) # 输出应为 20
Java代码实现
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.HashSet;
import java.util.Set;
public class WorkdaysCalculator {
public static int workdaysBetweenDates(String startDate, String endDate, String[] holidays) {
// 解析日期
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate start = LocalDate.parse(startDate, formatter);
LocalDate end = LocalDate.parse(endDate, formatter);
// 将公共假期列表转换为日期对象
Set<LocalDate> holidaySet = new HashSet<>();
for (String holiday : holidays) {
holidaySet.add(LocalDate.parse(holiday, formatter));
}
// 计算工作日
int workdays = 0;
for (LocalDate date = start; !date.isAfter(end); date = date.plusDays(1)) {
// 检查是否为周末或公共假期
if (date.getDayOfWeek().getValue() < 6 && !holidaySet.contains(date)) {
workdays++;
}
}
return workdays;
}
public static void main(String[] args) {
String startDate = "2024-05-01";
String endDate = "2024-05-31";
String[] holidays = {"2024-05-25"};
System.out.println(workdaysBetweenDates(startDate, endDate, holidays)); // 输出应为 20
}
}
在这两种实现中,我们首先将日期字符串转换为日期对象,然后遍历两个日期之间的每一天,检查它是否是工作日(不是周末也不是假期),并计算工作日的总数。
所有的后端面试常见的问题,我们每天都会在我们的编程群里面讨论和Code review, 欢迎大家加入我们的编程群,一起学习和进步。