如何基于pytz时区推断dateutil.parser.parse的dayfirst参数解析日期字符串
根据pytz时区判定dateutil解析参数
dayfirst的实现方案 短日期的书写顺序(DD/MM/YY或MM/DD/YY)是地区层面的固定通用惯例,不需要做复杂推断,直接按时区匹配规则即可:
- 全球除美国、加拿大、菲律宾外的所有国家和地区,民用短日期默认书写顺序为
DD/MM/YY,解析时dayfirst参数设为True - 美国、加拿大、菲律宾全境民用短日期默认书写顺序为
MM/DD/YY,解析时dayfirst参数设为False
实现步骤
- 从pytz时区对象提取时区标识:通过pytz时区实例的
zone属性,可拿到Asia/Shanghai、America/New_York这类标准时区字符串 - 匹配时区标识判定参数值:
- 时区属于美国、加拿大、菲律宾属地时,
dayfirst=False - 其余所有时区,
dayfirst=True
- 时区属于美国、加拿大、菲律宾属地时,
- 调用
dateutil.parser.parse传入对应参数解析字符串,取返回值的.date()属性,即可得到datetime.date类型结果
可直接复用的代码
import pytz from dateutil.parser import parse from datetime import date def tz_based_date_parse(date_str: str, target_tz: pytz.BaseTzInfo) -> date: tz_key = target_tz.zone dayfirst = True # 匹配美、加主流时区 if tz_key.startswith("America/"): us_ca_locations = { "New_York", "Chicago", "Denver", "Phoenix", "Los_Angeles", "Anchorage", "Honolulu", "Toronto", "Vancouver", "Montreal", "Calgary", "Edmonton", "Winnipeg", "Halifax", "St_Johns" } location_part = tz_key.split("/")[1] if location_part in us_ca_locations: dayfirst = False # 匹配菲律宾时区 elif tz_key == "Asia/Manila": dayfirst = False parsed_res = parse(date_str, dayfirst=dayfirst, fuzzy=False) return parsed_res.date()
若业务涉及美、加、菲的小众属地时区,只需要把对应时区的地区名追加到
us_ca_locations集合中即可,不需要调整整体判定逻辑。
内容的提问来源于stack exchange,提问作者kikoololmdr
相关产品推荐
相关产品推荐

