热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python:获取“3年前的今天”的日期时间

原文链接:Python:获取“3年前的今天”的日期时间Python:getdatetimefor3yearsagotoday在Python中,如何获取3年前的今天的datetime

原文链接:


Python:获取“ 3年前的今天”的日期时间

Python: get datetime for '3 years ago today'

在Python中,如何获取" 3年前的今天"的datetime对象?

更新:FWIW,我不太在乎准确性……也就是说,今天是2月29日,我不在乎我的答案是2月28日还是3月1日。 在这种情况下,简洁比可配置性更重要。

 相关讨论



  • 如何创建等于15分钟前的DateTime的可能重复项?

  • 大概是今天的3月1日,无论之间是否有a年,您都想获得3月1日? 我认为所有现有的答案在这方面都失败了。

  • 几乎但不完全:不变的15分钟与没有变化的3年之间的差异是巨大的。

  • @Jason我同意你的观点,尽管从OP的编辑看来,他似乎并不太担心,所以这样的话将是重复的。

  • 当人们接受明显不正确的答案时,此站点确实需要社区替代的方法。 3 * 365天不是3年,并且在那里有正确的答案。

  • @Glenn Maynard-您可以编辑标题。 因为他真的不想要3年前。

如果需要精确,请使用dateutil模块来计算相对日期:

from datetime import datetime
from dateutil.relativedelta import relativedelta
three_yrs_ago
= datetime.now() - relativedelta(years=3)


  • 感谢您的准确性。即使OP不在乎准确性,其他人也可能会。

import datetime
datetime.datetime.now()
- datetime.timedelta(days=3*365)


  • (-1)这显然是错误的,因为它不处理leap年。

  • AP257说:"我不太在乎准确性"。我解释为"我不在乎leap年"

  • @Diniz:您将其解释为"我想错了"。做到这一点是如此容易,做错它只是愚蠢的,当有正确答案时,就很奇怪地接受这个答案。

  • 提问者明确告诉相反的情况时,给出一个不太简洁但更准确的答案是否正确?

  • +1为简单起见。也许OP只是想举一个总体上如何做这样的例子。

  • 这有点草率。

  • 感谢您的简单性。我也不在乎准确性。无论如何,我实际上一直在寻找不同的日子。

  • 对于"我不太在乎准确性"给出的示例表明,提问者实际上并未充分考虑问题。该示例并不关心2月29日变为2月28日还是3月1日,但是此代码可以(通常将)执行将3月5日转换为3月6日的操作。不关心第一件事的人可能仍然会关心第二件事。 。

  • 如果您特别关心地球在轨道上的位置,则可以通过乘以365.2422来精确地处理leap年。

  • 减去365 * 3天当然是错误的-您跨越crossing年的时间超过一半。


dt datetime.now()
dt = dt.replace(year=dt.year-3)
# datetime.datetime(2008, 3, 1, 13, 2, 36, 274276)

ED:为了正确地解决the年问题,

def subtract_years(dt, years):
try:
dt
= dt.replace(year=dt.year-years)
except ValueError:
dt
= dt.replace(year=dt.year-years, day=dt.day-1)
return dt


  • 我认为这是经常被忽视的事情。

  • 好吧,现在您还有另一个问题:datetime.datetime(2008,2,29).replace(year=2005) -> ValueError。捕捉到该错误并减去一整天,我认为它仍然更加准确。

  • @Jochen:是的,很简单。

  • 我一直忘了replace。它比我的解决方案更简单。

  • @Mark:我也刚开始做过;我最初做的是你做的。不过,该网站似乎在该版本的编辑历史记录中放错了该版本。

  • 2100年后会发生什么?

def add_years(dt, years):
try:
result
= datetime.datetime(dt.year + years, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond, dt.tzinfo)
except ValueError:
result
= datetime.datetime(dt.year + years, dt.month, dt.day - 1, dt.hour, dt.minute, dt.second, dt.microsecond, dt.tzinfo)
return result
>>> add_years(datetime.datetime.now(), -3)
datetime.datetime(
2008, 3, 1, 12, 2, 35, 22000)
>>> add_years(datetime.datetime(2008, 2, 29), -3)
datetime.datetime(
2005, 2, 28, 0, 0)

尽管使用dateutil的答案很好,但是另一种方法是在PyPI上使用pendulum包。有关更多信息,请参阅其文档。

>>> import pendulum
>>> dt = pendulum.now().subtract(years=3)
>>> dt
DateTime(
2015, 10, 5, 17, 44, 41, 82598, tzinfo=Timezone('America/New_York'))
>>> type(dt)
pendulum.datetime.DateTime

如果您需要当前日期时间来进一步使用,则可能应该先将pendulum.now()保存到变量中,然后再使用该变量!

如果您确实想避免时区,请使用.naive()。

您不需要将结果转换为原生Python对象,但是如果确实需要,一种实现方法是:

>>> import datetime
>>> pydt = datetime.datetime.fromisoformat(dt.isoformat())
>>> pydt
datetime.datetime(
2015, 10, 5, 17, 44, 41, 82598, tzinfo=datetime.timezone(datetime.timedelta(days=-1, secOnds=72000)))
>>> type(pydt)
datetime.datetime

看不到它,它非常简单明了,

In [1]: import datetime
In [2]: dt datetime.datetime.today()
In [3]: datetime.datetime(year=dt.year-3, month=dt.month, day=dt.day)
Out[3]: datetime.datetime(201641100)

为什么不简单在替换年份之前检查a年。
这不需要任何额外的程序包或try:Except。

def years_ago(dt, years):
if dt.mOnth== 2 and dt.day == 29:
dt
= dt.replace(day=28)
return dt.replace(year=dt.year - years)

In [3]: import datetime as dt
In [
4]: today=dt.date.today()
In [
5]: three_years_ago=today-dt.timedelta(days=3*365)
In [
6]: three_years_ago
Out[
6]: datetime.date(2008, 3, 1)

 



推荐阅读
  • 构建Python自助式数据查询系统
    在现代数据密集型环境中,业务团队频繁需要从数据库中提取特定信息。为了提高效率并减少IT部门的工作负担,本文探讨了一种利用Python语言实现的自助数据查询工具的设计与实现。 ... [详细]
  • 本文介绍了一个简单的Python函数,该函数能够接收一个日期作为输入,并返回这一天是星期几。此功能通过使用Python的datetime模块实现。 ... [详细]
  • 使用Python轻松合并大量复杂Excel文件
    当面对大量的Excel文件时,如何高效地将它们合并成一个文件成为了一项挑战。本文将指导初学者如何利用Python的几个库,在几十行代码内完成这一任务。 ... [详细]
  • Python图像处理库概览
    本文详细介绍了Python中常用的图像处理库,包括scikit-image、Numpy、Scipy、Pillow、OpenCV-Python、SimpleCV、Mahotas、SimpleITK、pgmagick和Pycairo,旨在帮助开发者和研究人员选择合适的工具进行图像处理任务。 ... [详细]
  • Iris 开发环境配置指南 (最新 Go & IntelliJ IDEA & Iris V12)
    本指南详细介绍了如何在最新的 Go 语言环境及 IntelliJ IDEA 中配置 Iris V12 框架,适合初学者和有经验的开发者。文章提供了详细的步骤说明和示例代码,帮助读者快速搭建开发环境。 ... [详细]
  • 吴裕雄探讨混合神经网络模型在深度学习中的应用:结合RNN与CNN优化网络性能
    本文由吴裕雄撰写,深入探讨了如何利用Python、Keras及TensorFlow构建混合神经网络模型,特别是通过结合递归神经网络(RNN)和卷积神经网络(CNN),实现对网络运行效率的有效提升。 ... [详细]
  • 本文档详细规划了从基础到高级的软件测试学习路径,包括但不限于测试基础、Linux和数据库、功能测试、Python编程、接口测试、性能测试、金融项目实战、UI自动化测试等内容,旨在为初学者和进阶者提供全面的学习指导。 ... [详细]
  • 本文介绍了一种算法,用于在一个给定的二叉树中找到一个节点,该节点的子树包含最大数量的值小于该节点的节点。如果存在多个符合条件的节点,可以选择任意一个。 ... [详细]
  • Shiro功能拓展:登录失败重试次数限制
    本文详细介绍了如何在Apache Shiro框架中实现对用户登录失败重试次数的限制,通过自定义密码匹配器来增强系统的安全性。该方法不仅能够有效防止暴力破解攻击,还能确保合法用户的账户安全。 ... [详细]
  • 本文档详细介绍了Robot Framework的基础知识、安装配置方法及其实用技巧。从环境搭建到编写第一个测试用例,涵盖了一系列实用的操作指南和最佳实践。 ... [详细]
  • 使用DataGridViewComboBoxColumn实现数据绑定与操作
    本文详细介绍如何在DataGridView中使用DataGridViewComboBoxColumn来加载、选择和保存数据库中的数据,提供具体的实现步骤和示例代码。 ... [详细]
  • 首先说一下,这是我在CSDN上的第一个文章,其实这个账号早在几年前就申请了,不过当时只是为了下载一个资源,而且也不怎么懂信息技术相关的领域,后来就再也没怎么动过,直到今天我才开始使用这个账号 ... [详细]
  • 本文探讨了如何在Symfony框架中正确设置日期时间字段的格式,以满足特定的显示需求。 ... [详细]
  • 本文探讨了Web API 2中特性的路由机制,特别是如何利用它来构建RESTful风格的URI。文章不仅介绍了基本的特性路由使用方法,还详细说明了如何通过特性路由进行API版本控制、HTTP方法的指定、路由前缀的应用以及路由约束的设置。 ... [详细]
  • 本文介绍如何使用 Python 计算两个时间戳之间的时间差,并将其转换为毫秒。示例代码展示了如何通过 `time` 和 `datetime` 模块实现这一功能。 ... [详细]
author-avatar
cws401_712
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有