MST

星途 面试题库

面试题:Swift 中如何计算两个日期之间的工作日天数

假设给定两个Date类型的日期,编写一个函数计算这两个日期之间工作日(周一至周五)的天数。需要考虑日期的边界情况,并且要处理不同时区的问题。
15.7万 热度难度
编程语言Swift

知识考点

AI 面试

面试题答案

一键面试
from datetime import datetime, timedelta
from dateutil import tz


def count_weekdays(start_date, end_date, start_tz=None, end_tz=None):
    if start_tz:
        start_date = start_date.replace(tzinfo=tz.gettz(start_tz))
    if end_tz:
        end_date = end_date.replace(tzinfo=tz.gettz(end_tz))

    # 将日期转换为UTC时间
    if start_date.tzinfo:
        start_date = start_date.astimezone(tz.UTC)
    else:
        start_date = start_date.replace(tzinfo=tz.UTC)
    if end_date.tzinfo:
        end_date = end_date.astimezone(tz.UTC)
    else:
        end_date = end_date.replace(tzinfo=tz.UTC)

    if start_date > end_date:
        start_date, end_date = end_date, start_date

    days_between = (end_date - start_date).days + 1
    total_weekdays = 0
    for i in range(days_between):
        current_date = start_date + timedelta(days=i)
        if current_date.weekday() < 5:
            total_weekdays += 1
    return total_weekdays

你可以使用以下方式调用:

# 示例用法
start_date = datetime(2023, 10, 1, 0, 0, 0)
end_date = datetime(2023, 10, 7, 0, 0, 0)
start_tz = 'Asia/Shanghai'
end_tz = 'America/New_York'
result = count_weekdays(start_date, end_date, start_tz, end_tz)
print(result)

在上述代码中:

  1. count_weekdays 函数接收两个 datetime 类型的日期 start_dateend_date,以及它们对应的时区 start_tzend_tz(时区以字符串形式传入,如 'Asia/Shanghai')。
  2. 首先判断并设置日期的时区信息,如果有时区信息则转换为UTC时间。
  3. 检查两个日期的先后顺序,如果 start_date 大于 end_date,则交换它们。
  4. 计算两个日期之间的天数,遍历每一天,判断是否为工作日(周一至周五),如果是则工作日计数器加一。
  5. 最后返回工作日的总数。

你可以根据实际需求修改和调整代码,例如输入日期的格式等。如果使用的是其他编程语言,思路类似,但具体实现方式会有所不同。例如在Java中,可以使用 java.time 包来处理日期和时区问题。以下是Java版本的代码示例:

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.concurrent.atomic.AtomicInteger;

public class WeekdayCounter {
    public static int countWeekdays(ZonedDateTime startDate, ZonedDateTime endDate) {
        if (startDate.isAfter(endDate)) {
            ZonedDateTime temp = startDate;
            startDate = endDate;
            endDate = temp;
        }

        AtomicInteger weekdayCount = new AtomicInteger(0);
        LocalDate currentDate = startDate.toLocalDate();
        LocalDate endLocalDate = endDate.toLocalDate();
        while (currentDate.isBefore(endLocalDate) || currentDate.isEqual(endLocalDate)) {
            if (currentDate.getDayOfWeek() != DayOfWeek.SATURDAY && currentDate.getDayOfWeek() != DayOfWeek.SUNDAY) {
                weekdayCount.incrementAndGet();
            }
            currentDate = currentDate.plusDays(1);
        }
        return weekdayCount.get();
    }

    public static void main(String[] args) {
        ZoneId startZone = ZoneId.of("Asia/Shanghai");
        ZoneId endZone = ZoneId.of("America/New_York");

        ZonedDateTime startDate = ZonedDateTime.of(2023, 10, 1, 0, 0, 0, 0, startZone);
        ZonedDateTime endDate = ZonedDateTime.of(2023, 10, 7, 0, 0, 0, 0, endZone);

        int result = countWeekdays(startDate, endDate);
        System.out.println(result);
    }
}

在Java代码中:

  1. countWeekdays 方法接收两个 ZonedDateTime 类型的日期,表示开始日期和结束日期。
  2. 首先检查并交换开始日期和结束日期,确保开始日期在前。
  3. 使用 AtomicInteger 来统计工作日的数量,通过 while 循环遍历从开始日期到结束日期(包括结束日期)的每一天,判断是否为工作日,如果是则计数器加一。
  4. main 方法中创建了示例的开始日期和结束日期,并指定了相应的时区,调用 countWeekdays 方法并输出结果。