如何为自定义非公历日期类简便实现strftime与strptime
自定义非公历日历的strftime/strptime简化实现方案
针对你已实现的自定义日期类,完全无需从零编写全部格式化与解析逻辑,核心思路是复用现有工具的核心逻辑,仅替换月份、星期的字符串映射规则。以下是具体可行的方案(以Python为例):
1. 基于datetime模块的适配层
如果你的自定义日历能与公历日期实现双向转换,这是最省心的方案:
- 格式化(strftime):先将自定义日期转换为
datetime.date对象,用它生成基础格式串,再把串中的公历月份/星期名称替换为你自定义的名称。 - 解析(strptime):先将输入字符串中的自定义月份/星期名称替换为对应数字(比如把自定义的"雪月"换成"12"),再用
datetime.strptime解析为公历日期,最后转换为你的自定义日期类。
示例代码片段:
from datetime import datetime class CustomDate: # 自定义月份、星期名称映射 MONTH_NAMES = ["孟春", "仲春", "季春", "孟夏", "仲夏", "季夏", "孟秋", "仲秋", "季秋", "孟冬", "仲冬", "季冬"] WEEKDAY_NAMES = ["朔日", "朏日", "望日", "既望", "晦日", "开日", "闭日"] # 示例 def __init__(self, day, month, year): self.day = day self.month = month self.year = year def to_gregorian(self): # 实现自定义日期转公历的逻辑,返回datetime.date对象 pass @classmethod def from_gregorian(cls, greg_date): # 实现公历日期转自定义日期的逻辑,返回CustomDate实例 pass def strftime(self, fmt): greg_date = self.to_gregorian() # 先用datetime生成基础格式文本 base_str = greg_date.strftime(fmt) # 替换月份全称/缩写 full_month = self.MONTH_NAMES[self.month - 1] base_str = base_str.replace("%B", full_month).replace("%b", full_month[:2]) # 替换星期全称/缩写 weekday_idx = greg_date.weekday() full_weekday = self.WEEKDAY_NAMES[weekday_idx] base_str = base_str.replace("%A", full_weekday).replace("%a", full_weekday[:2]) return base_str @classmethod def strptime(cls, date_str, fmt): temp_str = date_str # 把自定义月份替换成数字 for idx, name in enumerate(cls.MONTH_NAMES, 1): temp_str = temp_str.replace(name, str(idx)).replace(name[:2], str(idx)) # 把自定义星期替换成数字 for idx, name in enumerate(cls.WEEKDAY_NAMES): temp_str = temp_str.replace(name, str(idx)).replace(name[:2], str(idx)) # 用datetime解析后转自定义日期 greg_date = datetime.strptime(temp_str, fmt).date() return cls.from_gregorian(greg_date)
2. 轻量封装格式化逻辑
如果不需要依赖公历转换,可以用Python的string.Formatter快速实现:
- 自行处理格式串中的指令:对于
%d、%Y这类直接取自定义日期类的字段值;对于%B、%A这类,直接从你的名称映射表中取值。 - 解析时用正则匹配提取日期各部分内容(比如月份名称、日、年),映射成数字后初始化自定义日期类。
关键注意事项
- 覆盖格式串的所有相关指令:
%B(月份全称)、%b(月份缩写)、%A(星期全称)、%a(星期缩写),确保映射准确。 - 解析时考虑输入的大小写、缩写变体,比如用户可能输入"孟春"或"孟",需要做好匹配处理。
内容的提问来源于stack exchange,提问作者AlfaZulu
相关产品推荐
相关产品推荐

