面试题答案
一键面试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)
在上述代码中:
count_weekdays
函数接收两个datetime
类型的日期start_date
和end_date
,以及它们对应的时区start_tz
和end_tz
(时区以字符串形式传入,如'Asia/Shanghai'
)。- 首先判断并设置日期的时区信息,如果有时区信息则转换为UTC时间。
- 检查两个日期的先后顺序,如果
start_date
大于end_date
,则交换它们。 - 计算两个日期之间的天数,遍历每一天,判断是否为工作日(周一至周五),如果是则工作日计数器加一。
- 最后返回工作日的总数。
你可以根据实际需求修改和调整代码,例如输入日期的格式等。如果使用的是其他编程语言,思路类似,但具体实现方式会有所不同。例如在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代码中:
countWeekdays
方法接收两个ZonedDateTime
类型的日期,表示开始日期和结束日期。- 首先检查并交换开始日期和结束日期,确保开始日期在前。
- 使用
AtomicInteger
来统计工作日的数量,通过while
循环遍历从开始日期到结束日期(包括结束日期)的每一天,判断是否为工作日,如果是则计数器加一。 main
方法中创建了示例的开始日期和结束日期,并指定了相应的时区,调用countWeekdays
方法并输出结果。