Python datetime 模塊常用功能(輕松搞定時(shí)間處理)
前言
在 Python 中,datetime模塊是處理日期和時(shí)間的核心工具,提供了簡(jiǎn)潔易用的類(lèi)和方法,能輕松解決時(shí)間解析、轉(zhuǎn)換、計(jì)算等常見(jiàn)需求。本文將系統(tǒng)梳理datetime模塊的常用功能,從基礎(chǔ)到進(jìn)階,讓你徹底掌握時(shí)間處理技巧。
一、核心類(lèi):datetime 模塊的 "四大金剛"
datetime模塊包含四個(gè)核心類(lèi),分別處理不同粒度的時(shí)間信息:
| 類(lèi)名 | 功能描述 | 示例 |
|---|---|---|
date | 處理日期(年、月、日) | date(2023, 10, 1) → 2023 年 10 月 1 日 |
time | 處理時(shí)間(時(shí)、分、秒、微秒) | time(15, 30, 45) → 15 時(shí) 30 分 45 秒 |
datetime | 處理日期 + 時(shí)間(最常用) | datetime(2023, 10, 1, 15, 30, 45) |
timedelta | 表示時(shí)間間隔(用于時(shí)間加減) | timedelta(days=3) → 3 天 |
二、獲取當(dāng)前時(shí)間:datetime.now () 的妙用
獲取當(dāng)前日期和時(shí)間是最基礎(chǔ)的操作,datetime.now() 可直接返回當(dāng)前本地時(shí)間:
from datetime import datetime, date, time # 1. 獲取當(dāng)前日期+時(shí)間(datetime對(duì)象) now = datetime.now() print(now) # 輸出:2023-10-01 15:30:45.123456 print(type(now)) # 輸出:<class 'datetime.datetime'> # 2. 單獨(dú)獲取當(dāng)前日期(date對(duì)象) today = date.today() print(today) # 輸出:2023-10-01 # 3. 單獨(dú)獲取當(dāng)前時(shí)間(time對(duì)象) current_time = datetime.now().time() print(current_time) # 輸出:15:30:45.123456
datetime.now()包含年、月、日、時(shí)、分、秒、微秒;- 可通過(guò)
datetime.utcnow()獲取當(dāng)前 UTC 時(shí)間(世界協(xié)調(diào)時(shí)間)。
三、時(shí)間對(duì)象的屬性與轉(zhuǎn)換
datetime、date、time 對(duì)象提供了豐富的屬性,可直接獲取年、月、日等信息,也能轉(zhuǎn)換為字符串:
1. 訪問(wèn)時(shí)間屬性
dt = datetime(2023, 10, 1, 15, 30, 45) # 獲取年、月、日 print(dt.year) # 2023 print(dt.month) # 10 print(dt.day) # 1 # 獲取時(shí)、分、秒、微秒 print(dt.hour) # 15 print(dt.minute) # 30 print(dt.second) # 45 print(dt.microsecond) # 0(手動(dòng)創(chuàng)建時(shí)未指定,默認(rèn)為0)
2. 轉(zhuǎn)換為字符串(格式化輸出)
用 strftime(format) 方法將時(shí)間對(duì)象轉(zhuǎn)為自定義格式的字符串(format 為格式化符號(hào)):
dt = datetime(2023, 10, 1, 15, 30, 45)
# 常用格式化符號(hào)
print(dt.strftime("%Y-%m-%d")) # 2023-10-01(年-月-日)
print(dt.strftime("%H:%M:%S")) # 15:30:45(時(shí):分:秒,24小時(shí)制)
print(dt.strftime("%Y年%m月%d日 %H:%M")) # 2023年10月01日 15:30
print(dt.strftime("%A, %B %d, %Y")) # Sunday, October 01, 2023(星期、月份全稱(chēng))常用格式化符號(hào)表:
| 符號(hào) | 含義 | 示例 |
|---|---|---|
| %Y | 4 位年份 | 2023 |
| %m | 2 位月份(01-12) | 10 |
| %d | 2 位日期(01-31) | 01 |
| %H | 24 小時(shí)制小時(shí)(00-23) | 15 |
| %I | 12 小時(shí)制小時(shí)(01-12) | 03 |
| %M | 2 位分鐘(00-59) | 30 |
| %S | 2 位秒數(shù)(00-59) | 45 |
| %a | 星期縮寫(xiě)(如 Sun) | Sun |
| %A | 星期全稱(chēng)(如 Sunday) | Sunday |
| %b | 月份縮寫(xiě)(如 Oct) | Oct |
| %B | 月份全稱(chēng)(如 October) | October |
3. 字符串轉(zhuǎn)時(shí)間對(duì)象(解析)
用 strptime(date_string, format) 方法將字符串解析為時(shí)間對(duì)象(format 需與字符串格式一致):
# 解析日期字符串 date_str = "2023-10-01" dt = datetime.strptime(date_str, "%Y-%m-%d") print(dt) # 輸出:2023-10-01 00:00:00(時(shí)間部分默認(rèn)00:00:00) # 解析帶時(shí)間的字符串 datetime_str = "2023-10-01 15:30:45" dt = datetime.strptime(datetime_str, "%Y-%m-%d %H:%M:%S") print(dt) # 輸出:2023-10-01 15:30:45
- 若字符串格式與
format不匹配,會(huì)報(bào)ValueError,需確保格式一致。
四、時(shí)間計(jì)算:timedelta 的靈活運(yùn)用
timedelta 表示時(shí)間間隔,可與 datetime 對(duì)象進(jìn)行加減運(yùn)算,實(shí)現(xiàn) “多少天后 / 前的時(shí)間” 等需求:
1. 創(chuàng)建 timedelta 對(duì)象
from datetime import timedelta # 常用參數(shù):days, seconds, minutes, hours, weeks delta1 = timedelta(days=3) # 3天 delta2 = timedelta(hours=12) # 12小時(shí) delta3 = timedelta(weeks=1, days=2) # 1周+2天=9天
2. 時(shí)間加減運(yùn)算
now = datetime.now()
# 計(jì)算3天后的時(shí)間
future = now + timedelta(days=3)
print(f"3天后:{future.strftime('%Y-%m-%d')}")
# 計(jì)算1小時(shí)30分鐘前的時(shí)間
past = now - timedelta(hours=1, minutes=30)
print(f"1小時(shí)30分鐘前:{past.strftime('%H:%M')}")
# 兩個(gè)datetime對(duì)象相減,得到timedelta
delta = future - now
print(f"時(shí)間間隔:{delta.days}天 {delta.seconds//3600}小時(shí)") # 3天 0小時(shí)3. 實(shí)用場(chǎng)景:計(jì)算兩個(gè)日期相差的天數(shù)
date1 = date(2023, 1, 1)
date2 = date(2023, 12, 31)
delta = date2 - date1
print(f"2023年共有{delta.days}天") # 輸出:364(2023不是閏年)
五、日期的替換與調(diào)整
datetime 對(duì)象是不可變的,但可通過(guò) replace() 方法創(chuàng)建修改后的新對(duì)象:
dt = datetime(2023, 10, 1, 15, 30) # 替換年份和月份 new_dt = dt.replace(year=2024, month=1) print(new_dt) # 2024-01-01 15:30:00 # 替換時(shí)間為0點(diǎn)0分 midnight = dt.replace(hour=0, minute=0, second=0, microsecond=0) print(midnight) # 2023-10-01 00:00:00
六、時(shí)區(qū)處理(進(jìn)階)
默認(rèn)情況下,datetime 不包含時(shí)區(qū)信息( naive 時(shí)間),處理跨時(shí)區(qū)時(shí)間需用 pytz 庫(kù)或 Python 3.9+ 的 zoneinfo 模塊(推薦):
1. 用 zoneinfo 處理時(shí)區(qū)(Python 3.9+)
from datetime import datetime
from zoneinfo import ZoneInfo # 需Python 3.9+
# 創(chuàng)建帶時(shí)區(qū)的datetime對(duì)象
# 北京時(shí)間(Asia/Shanghai)
beijing_time = datetime(2023, 10, 1, 8, 0, tzinfo=ZoneInfo("Asia/Shanghai"))
# 紐約時(shí)間(America/New_York)
newyork_time = datetime(2023, 10, 1, 8, 0, tzinfo=ZoneInfo("America/New_York"))
print(f"北京時(shí)間:{beijing_time}") # 2023-10-01 08:00:00+08:00
print(f"紐約時(shí)間:{newyork_time}") # 2023-10-01 08:00:00-04:00
# 轉(zhuǎn)換為UTC時(shí)間
utc_time = beijing_time.astimezone(ZoneInfo("UTC"))
print(f"對(duì)應(yīng)的UTC時(shí)間:{utc_time}") # 2023-09-30 23:00:00+00:002. 時(shí)區(qū)轉(zhuǎn)換
# 將紐約時(shí)間轉(zhuǎn)換為北京時(shí)間
beijing_from_newyork = newyork_time.astimezone(ZoneInfo("Asia/Shanghai"))
print(f"紐約時(shí)間{newyork_time.strftime('%H:%M')} 對(duì)應(yīng)北京時(shí)間:{beijing_from_newyork.strftime('%H:%M')}")
# 輸出:紐約時(shí)間08:00 對(duì)應(yīng)北京時(shí)間20:00(時(shí)差12小時(shí))
七、常見(jiàn)錯(cuò)誤與解決方案
錯(cuò)誤:字符串解析格式不匹配
# 錯(cuò)誤示例:字符串是"10/01/2023",格式用了"%Y-%m-%d"
datetime.strptime("10/01/2023", "%Y-%m-%d") # ValueError
# 正確:格式改為"%m/%d/%Y"
datetime.strptime("10/01/2023", "%m/%d/%Y") # 2023-10-01 00:00:00錯(cuò)誤:datetime 對(duì)象不可直接修改
dt = datetime(2023, 10, 1) dt.year = 2024 # AttributeError: can't set attribute # 正確:用replace() dt = dt.replace(year=2024)
錯(cuò)誤:不同時(shí)區(qū)的時(shí)間直接比較
# 避免直接比較naive時(shí)間(無(wú)時(shí)區(qū))和aware時(shí)間(有時(shí)區(qū))
naive_dt = datetime(2023, 10, 1)
aware_dt = datetime(2023, 10, 1, tzinfo=ZoneInfo("UTC"))
naive_dt == aware_dt # 報(bào)錯(cuò):TypeError: can't compare offset-naive and offset-aware datetimes
總結(jié)
datetime模塊是 Python 處理時(shí)間的 “瑞士軍刀”,核心功能包括:
- 用
datetime.now()獲取當(dāng)前時(shí)間; - 用
strftime()和strptime()實(shí)現(xiàn)時(shí)間與字符串的轉(zhuǎn)換; - 用
timedelta進(jìn)行時(shí)間加減計(jì)算; - 用
replace()調(diào)整日期或時(shí)間; - 用
zoneinfo(或pytz)處理時(shí)區(qū)問(wèn)題。
掌握這些方法,能輕松應(yīng)對(duì)日志記錄、日程計(jì)算、數(shù)據(jù)時(shí)間戳解析等常見(jiàn)場(chǎng)景。建議根據(jù)具體需求選擇合適的類(lèi)(datetime最常用),并注意字符串格式與時(shí)間對(duì)象的轉(zhuǎn)換細(xì)節(jié)。
到此這篇關(guān)于Python datetime 模塊常用功能(輕松搞定時(shí)間處理)的文章就介紹到這了,更多相關(guān)Python datetime 模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在PyCharm的 Terminal(終端)切換Python版本的方法
這篇文章主要介紹了在PyCharm的 Terminal(終端)切換Python版本的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
python正則表達(dá)式查找和替換內(nèi)容的實(shí)例詳解
在本篇文章里小編給大家整理的是一篇關(guān)于python正則表達(dá)式查找和替換內(nèi)容的實(shí)例詳解內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。2021-10-10
python爬蟲(chóng)之利用selenium模塊自動(dòng)登錄CSDN
這篇文章主要介紹了python爬蟲(chóng)之利用selenium模塊自動(dòng)登錄CSDN,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下2021-04-04
Python Pexpect庫(kù)的簡(jiǎn)單使用方法
這篇文章主要介紹了Python Pexpect庫(kù)的簡(jiǎn)單使用方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
利用一個(gè)簡(jiǎn)單的例子窺探CPython內(nèi)核的運(yùn)行機(jī)制
這篇文章主要介紹了利用一個(gè)簡(jiǎn)單的例子窺探CPython內(nèi)核的運(yùn)行機(jī)制,作者通過(guò)一個(gè)簡(jiǎn)單的輸出函數(shù)深入、介紹了CPython源碼C代碼中的一些函數(shù),需要的朋友可以參考下2015-03-03
Python中parsel兩種獲取數(shù)據(jù)方式小結(jié)
本文主要介紹了Python中parsel兩種獲取數(shù)據(jù)方式小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04

