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

