【问题标题】:Python: Convention for date with no yearPython:没有年份的日期约定
【发布时间】:2015-01-30 03:01:48
【问题描述】:

我有一个脚本可以查看生日列表,然后计算年龄。有的生日有年、月、日,有的只有月、日。

有年头的我有dob = date(year, month, day)

但是对于那些没有年份的,存储日期的适当约定是什么,因为date() 需要一个年份参数?

现在我说没有出生年份的每个人都出生在 1500 年(所以我至少以后可以很容易地识别他们),但这显然是一个愚蠢的解决方案。

【问题讨论】:

  • 我喜欢你的解决方案 :)
  • 似乎是一个公平的解决方案。
  • 只要确保你使用的是闰年 - 1500 是,所以你很好
  • @ekhumero 这是闰年,因为公历和儒略历在 1582 年之前适用不同的规则......但有点跑题了
  • @user2782067: 1500 不是 datetime 模块使用的 proleptic 公历中的闰年。试试:from datetime import date; date(1500, 2, 29) 应该提高 ValueError,而 date(1504, 2, 29) 不会。

标签: python date


【解决方案1】:

我认为在定义数据结构(而不​​是其他东西!)时多走一点是值得的,并且不使用像您的年份 1500 这样的约定。因此:

from dataclasses import dataclass

@dataclass
class Birthday:
    day: int
    month: int
    year: Optional[int] = None

    def is_valid(self) -> bool:
        try:
            dt = date(self.year, self.month, self.day)
            return True
        except ValueError:
            return False

dataclass 仅在创建或打印生日时提供额外的便利。现在您可以:

birthday_without_year = Birthday(day=3, month=5)
birthday_with_year = Birthday(day=3, month=5, year=2000)

如果你愿意,你可以覆盖默认的__init__,如果有人过了一年,你可以检查生日is_valid

【讨论】:

    【解决方案2】:

    如果没有year;不要使用datetime.date 类。 date 必须有 year。如果year 存在,则在每次需要时即时计算date 字段,和/或在自定义对象上创建self.date 属性,以在用于没有年份的对象时引发错误。

    【讨论】:

    • 这可能是一个很好的解决方案,但在我的情况下,我最终必须将所有日期转换为标准化格式,datetime.date 可能是最好的选择。我的策略是在我的年龄计算器函数中处理闰年异常,并且只有在它们有年份时才将日期传递给它。
    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 2021-06-07
    相关资源
    最近更新 更多