Ruby日期计算问题:忽略周末倒推14个工作日的实现困境
解决倒推14个工作日(跳过周末)的问题
嘿,我来帮你搞定这个日期计算的坑!看你的描述,问题应该出在只处理了单周的固定偏移逻辑,没有持续迭代检查跨越多周的工作日——所以只能正确算出一周内的日期,后面就开始重复循环了。
核心思路
要解决这个问题,最可靠的方式是逐个倒推日期,每次检查是否为周末,是就继续往前推,直到找到工作日,重复这个过程直到收集够14个符合要求的日期。这种方式不会受周边界的限制,不管跨多少周都能正确计算。
示例实现(Python)
用Python的datetime库来实现的话,代码会很清晰:
from datetime import datetime, timedelta def get_last_14_workdays(start_date=None): # 默认从今日开始 if start_date is None: start_date = datetime.today().date() workdays = [] current_date = start_date while len(workdays) < 14: # 往前倒推1天 current_date -= timedelta(days=1) # 检查是否为工作日:weekday()返回0=周一,4=周五,5=周六,6=周日 if current_date.weekday() < 5: workdays.append(current_date) return workdays # 测试调用 last_14_days = get_last_14_workdays() for idx, day in enumerate(last_14_days, 1): print(f"倒推第{idx}天:{day.strftime('%Y-%m-%d')}({['周一','周二','周三','周四','周五','周六','周日'][day.weekday()]})")
逻辑解释
- 从指定日期(默认今天)开始,每次往前移动1天
- 用
weekday()方法判断当前日期是否为工作日:返回值小于5就是周一到周五 - 如果是工作日,就加入结果列表;如果是周末,跳过继续往前推
- 直到结果列表里有14个日期为止
这样不管跨多少周,都能正确跳过所有周末,不会出现重复循环的问题。比如今天是周一(2024-05-20),倒推第1天是周五(2024-05-17),第2天是周四(2024-05-16),……第5天是上周周一(2024-05-13),第6天就会跳到上周五(2024-05-10),完全符合你的需求。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

