Python获取"3年前的今天"的日期时间问题
作者:爱家家的卡卡 发布时间:2022-02-01 12:12:13
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年的时间超过一半。
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(2016, 4, 11, 0, 0)
为什么不简单在替换年份之前检查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)
ps:python获取三年前的日期
three_yrs_ago_day = (datetime.now() - relativedelta(years=3)).strftime('%Y%m%d')
python处理几年前几月前几日前的时间
def conv_time(t):
min = int(re.findall('\d+', t)[0])
print(min,'---')
dt = arrow.now()
if u'秒' in t:
s = (dt - timedelta(seconds=min))
elif u'分钟' in t:
s = (dt - timedelta(minutes=min))
elif u'小时' in t:
s = (dt - timedelta(hours=min))
elif u'天' in t:
s = (dt - timedelta(days=min))
elif u'周' in t:
s = (dt - timedelta(weeks=min))
elif u'月' in t:
s = dt.shift(months=-min)
elif u'年' in t:
s =str(int(datetime.datetime.now().strftime("%Y"))-min)+"-"+datetime.datetime.now().strftime("%m-%d")
else:
t += ", " + current_year
s = datetime.strptime(t, "%m-%d, %Y")
return int(time.mktime(s.timetuple()))
python3 获取n年前日期
import time
import datetime
import random
#13位时间戳
temp=time.time()
timestamp=int(round(temp*1000))
str_timestamp=str(timestamp)
t=datetime.datetime.now()
#15年前
d2=(t+datetime.timedelta(days=-365*15)).strftime("%Y%m%d")
#23年前
d3=(t+datetime.timedelta(days=-365*23)).strftime("%Y%m%d")
print(str_timestamp)
print(d2)
print(d3)
输出
macname@MacdeMacBook-Pro Desktop % python3 test.py
1610095883568
20060112
19980114
macname@MacdeMacBook-Pro Desktop %
来源:https://www.cnblogs.com/kaka0318/p/17042968.html


猜你喜欢
- 本文主要介绍了python opencv 找出图像中的最大轮廓并填充,分享给大家,具体如下:import cv2import numpy a
- 网页可以说是网站构成的基本元素。当我们轻点鼠标,在网海中遨游,一幅幅精彩的网页会呈现在我们面前,那么,网页的精彩与否的因素是什么呢?色彩的搭
- pip是一个很好用的第三方库安装方式,但是默认的源没法连接,就算有时候可以成功率也很低,所以换成国内镜像源比较方便。将pip源更换到国内镜像
- JS添加/删除事件在IE和支持dom浏览器分别为:attachEvent(ie中的添加事件),detachEvent(ie中的删除事件),a
- 数据采集我们上一篇介绍了,如何采集王者皮肤,买不起皮肤,当个桌面壁纸挺好的。我们今天来学习如何采集电影评论,看看这个电影好不好看。发送请求我
- 一 概述Python生态系统的一些核心基础数据分析库:NumPy:支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,包含
- 如何实现让每句话的头一个字母都大写? <%dim txtFnametxtFName = &qu
- 网站内容的入口很大一部分都是依赖于导航系统,而网站的入口很大一部分依赖于搜索系统,这也在一定意义上证明了导航与搜索之间的重叠性。搜索系统可以
- 一、字典转dataFrame1、字典转dataFrame比较简单,直接给出示例:import pandas as pddic = {'
- Xxencode编码,也是一个二进制字符转换为普通打印字符方法。跟UUencode编码原理方法很相似,唯独不同的是可打印字符不同。通个UUe
- transforms.CenterCrop(size)将给定的PIL.Image进行中心切割,得到给定的size,size可以是tuple,
- 大家好,今天我们要讲的是如何使用 Pyecharts 制作动态排名变化图:point_down:制作这样的一个动态图使用到的是 Pyecha
- 有时候,我们需要将文本转换为图片,比如发长微博,或者不想让人轻易复制我们的文本内容等时候。目前类似的工具已经有了不少,不过我觉得用得都不是很
- 相信用过Gmail的人都知道Gmail有一个草稿自动保存的功能,每过一段时间,Gmail都会自动保存邮件草稿,这样在一些突 * 况下就能快速地
- 这里就简单介绍两种: 一、增加超时的时间限制 这里需要注意:set_time_limit只是设置你的PHP程序的超时时间,而不是file_g
- 很长时间以来,一直想将自己的一些零碎的想法总结下,给自己一个完整的思维,也算是做个存档。一家之言,绝不敢说对别人会有什么帮助,对外人的层面上
- 一、前提1、MySQL版本信息:MySQL版本:8.0.27注意:其他版本(主要5.x版本未验证)2、表字段:定义列CREATE TABLE
- Notepad++是一款不错的编辑器,很轻巧,我很喜欢它。再换个主题,加个代码高亮,看上去就更专业了。如果你是Mac用户,应该听说或使用过T
- 一、什么是MQTTMQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/
- 区别:xx:公有变量,所有对象都可以访问;xxx:双下划线代表着是系统定义的名字。__xxx:双前置下划线,避免与子类中的属性命名冲突,无法