You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何判断字符串格式日期是否处于指定字符串时间区间内

动物园参观日期判断实现方案

核心逻辑

  • 所有日期仅对比月、日维度,年份统一使用strptime默认的1900年即可,不影响区间判断结果
  • 拆分不可访问时段字符串为起止日期对象,分两种场景判断:
    • 起止日期同年:用户输入日期落在起止区间内即为不可访问
    • 起止日期跨年(如11月到次年2月):用户输入日期大于等于开始日期,或小于等于结束日期即为不可访问
  • 遍历所有动物,仅输出不在不可访问时段内的动物名称

完整可运行代码

from datetime import datetime

def input_date():  
    while True:
        try:
            date = input("请输入您计划参观的日期 (格式DD/MM): ")
            pattern_date = '%d/%m'
            date = datetime.strptime(date, pattern_date)
        except ValueError:
            print("日期格式不合法,请重新输入")
            continue
        else:
            break
    return date

def is_in_inaccessible_period(user_date, period_str):
    # 拆分不可访问时段字符串
    start_str, end_str = period_str.split(' - ')
    date_format = '%d/%m'
    start_date = datetime.strptime(start_str, date_format)
    end_date = datetime.strptime(end_str, date_format)
    # 同年度时段判断
    if start_date <= end_date:
        return start_date <= user_date <= end_date
    # 跨年度时段判断
    else:
        return user_date >= start_date or user_date <= end_date

# 动物类定义
class Animal:
    def __init__(self, species, inaccessible):
        self.species = species
        self.inaccessible = inaccessible
    
bear = Animal("熊","01/10 - 30/04") # 原参数31/04为非法日期,已修正为4月30日
lion = Animal("狮子", "01/11 - 28/02")
penguin = Animal("企鹅", "01/05 - 31/08")

if __name__ == "__main__":
    date = input_date()
    all_animals = [bear, lion, penguin]
    # 筛选可访问动物
    accessible_animals = [ani.species for ani in all_animals if not is_in_inaccessible_period(date, ani.inaccessible)]
    print("今日可参观的动物:")
    for ani in accessible_animals:
        print(f"- {ani}")

关键说明

  • 原有代码中熊的不可访问时段写为01/10 - 31/04,4月不存在31日属于非法日期,上述代码已修正为30/04
  • 如果需要兼容闰年2月29日的特殊场景,可以额外增加2月29日的适配逻辑,当前方案默认遵循平年28日的规则

内容的提问来源于stack exchange,提问作者David Gallego

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:06:03