網站首頁 編程語言 正文
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
相關推薦
- 2022-05-31 Android調用手機攝像頭拍照和錄音功能_Android
- 2022-04-04 前端小技巧:關閉瀏覽器時觸發事件
- 2022-08-18 C#實現從位圖到布隆過濾器的方法_C#教程
- 2022-07-19 iptables限制docker端口禁止對某臺主機進行提供服務
- 2022-09-30 python實現圖像邊緣檢測_python
- 2022-08-23 React?中的列表渲染要加?key的原因分析_React
- 2024-04-06 linux環境docker安裝redis(AOF和RDB持久化)
- 2023-06-19 C++單一職責原則示例代碼淺析_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支