问题描述

要求

示例输入

示例输出

解决思路

Python代码实现

Java代码实现

计算两个日期之间的工作日天数(不包括周末),用Python和Java实现

问题描述

编写一个函数,输入两个日期,返回这两个日期之间的工作日天数(即周一至周五的天数,不包括周末周六和周日)。

要求

  1. 函数应接受两个日期作为输入,格式为 YYYY-MM-DD
  2. 函数应返回两个日期之间的工作日天数。
  3. 考虑公共假期的影响,提供一个公共假期列表,并排除这些假期。

示例输入

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

解决思路

  1. 解析日期:首先,我们需要解析输入的日期字符串,将其转换为可以进行日期计算的格式。

  2. 计算日期差:计算两个日期之间的天数差。

  3. 排除周末:遍历这两个日期之间的每一天,排除周六和周日。

  4. 考虑公共假期:在计算过程中,检查每一天是否是公共假期,如果是,则不计入工作日。

  5. 返回结果:最后,返回计算得到的工作日天数。

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, 欢迎大家加入我们的编程群,一起学习和进步。

编程交流群

友情链接:

Copyright© 2024 杭州园中葵科技有限公司 版权所有