使用 datetime.timedelta 添加年份

新手上路,请多包涵

我正在用 Python 进行一些时间计算。

目标:

其中一部分是试图:

给定一个日期,加上时间间隔(X年,X月,X周),返回日期

IE

  • 输入参数:input_time (datetime.date), interval (datetime.timedelta)
  • 返回:日期时间.日期

我查看了 datetime 和 datetime.timedelta 文档

class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)¶

如果我想增加一定的小时数或周数,这些似乎很有效。然而,

问题:

  • 我正在尝试执行 日期 + 1 年之 类的操作,但无法弄清楚

例如

start = datetime.datetime(2000, 1, 1)
# expected output: datetime.datetime(2001, 1, 1)

# with the weeks, etc arguments given in timedelta, this fails unsurprisingly e.g
start + datetime.timedelta(weeks = 52)

# returns datetime.datetime(2000, 12, 30, 0, 0)

问题

  • 使用 datetime 的基本工具是否可以实现基于年份的操作 - 如果可以,我将如何处理?

  • 我意识到对于年示例,我可以只做 start.replace(year = 2001) ,但是如果我有几个月或几周的输入,这种方法就会失败。

  • 根据我的理解, dateutil 库具有更多高级功能,但我不清楚它与内置 datetime 对象的交互效果如何。

我已经审查了这个类似的 问题,但它并没有帮助我解决这个问题。

任何帮助深表感谢!

在 MacO 上运行 Python 3.6.5。

原文由 patrick 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

timedelta 不支持年份,因为一年的持续时间取决于哪一年(例如闰年有2月29日)。

您可以使用 relativedelta 代替(来自 PyPI 包 python-dateutil )它确实支持 years 并考虑了添加的基线日期。

 >>> from dateutil.relativedelta import relativedelta
>>> import datetime
>>> d = datetime.date(2020, 2, 29)
>>> d
datetime.date(2020, 2, 29)
>>> d + relativedelta(years=1)
datetime.date(2021, 2, 28)

原文由 wim 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用 replace 来硬编码日期时间的新年份值 :)

这避免了闰年等。

 year_later = current.replace(year=current.year + 1)

请注意,如果当前日期恰好是 2 月 29 日,这将引发 ValueError 并显示消息:“Day is out of range for month”。所以你需要像这样处理这种特殊情况:

 if current.month == 2 and current.day == 29:
    year_later = current.replace(year=current.year + 1, day=28)
else:
    year_later = current.replace(year=current.year + 1)

原文由 enongad 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题