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

如何为自定义非公历日期类简便实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:53:13