最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python處理時(shí)間格式化的操作指南

 更新時(shí)間:2026年04月22日 09:44:55   作者:曾阿倫  
本文介紹了Python3中處理時(shí)間格式化的核心方法,包括三大模塊(time/datetime/calendar)的適用場景對比、基礎(chǔ)的時(shí)間表示形式轉(zhuǎn)換(時(shí)間戳/datetime對象/字符串互轉(zhuǎn))以及進(jìn)階的時(shí)區(qū)處理技巧,重點(diǎn)講解了datetime模塊的strftime()和strptime()方法實(shí)現(xiàn)時(shí)間格式化與解析

ISO 8601是國際標(biāo)準(zhǔn)化組織(ISO)制定的日期和時(shí)間的表示方法,全稱為《數(shù)據(jù)存儲和交換形式·信息交換·日期和時(shí)間的表示方法》。目前,ISO 8601是全球通用的日期和時(shí)間格式標(biāo)準(zhǔn),它定義了日期和時(shí)間的表示方法,包括年、月、日、時(shí)、分、秒等1。除了ISO 8601之外,還有一些其他的日期和時(shí)間格式標(biāo)準(zhǔn),例如RFC 3339、RFC 2822等2。

# 東八區(qū)標(biāo)準(zhǔn)時(shí)間格式示例
1970-01-01T00:00:00+08

一、核心模塊:Python3 時(shí)間處理的 3 大工具

Python3 提供了 3 個(gè)核心模塊用于時(shí)間處理,各自側(cè)重不同場景,按需選擇即可:

模塊核心作用適用場景優(yōu)點(diǎn)缺點(diǎn)
time底層時(shí)間操作(時(shí)間戳、休眠)快速獲取時(shí)間戳、簡單時(shí)間計(jì)算輕量、執(zhí)行快格式化功能薄弱,不支持復(fù)雜日期運(yùn)算
datetime日期時(shí)間類(datetime/date/time大部分業(yè)務(wù)場景(格式轉(zhuǎn)換、日期運(yùn)算)功能全面、API 友好時(shí)區(qū)支持需配合 pytz/zoneinfo
calendar日歷相關(guān)操作(月份日歷、星期計(jì)算)日歷生成、節(jié)假日判斷專注日歷場景日常格式化用不上,功能單一

建議:

優(yōu)先使用datetime模塊,覆蓋 90% 以上的時(shí)間格式化需求;復(fù)雜時(shí)區(qū)場景搭配 zoneinfo(Python3.9+ 內(nèi)置)或 pytz。

二、基礎(chǔ)用法:時(shí)間格式化核心操作

1. 關(guān)鍵概念:時(shí)間的 3 種表示形式

Python 中時(shí)間有 3 種常用表示,格式化的核心是「不同形式之間的轉(zhuǎn)換」:

  • 時(shí)間戳:從 1970-01-01 00:00:00 UTC 到當(dāng)前時(shí)間的秒數(shù)(float 類型);
  • datetime 對象datetime.datetime 類實(shí)例(最靈活,支持各種運(yùn)算和格式化);
  • 字符串:人類可讀的時(shí)間格式(如 2024-05-20 13:14:52、2024/05/20)。

2. 核心轉(zhuǎn)換:3 種形式互轉(zhuǎn)(高頻)

(1)獲取當(dāng)前時(shí)間(3 種形式)

import time

from datetime import datetime

# 1. 獲取時(shí)間戳(秒級)

timestamp = time.time()

print(f"秒級時(shí)間戳:{timestamp}")  # 輸出:1716202492.123456

# 2. 獲取毫秒級時(shí)間戳(業(yè)務(wù)常用)

ms_timestamp = int(time.time() * 1000)

print(f"毫秒級時(shí)間戳:{ms_timestamp}")  # 輸出:1716202492123

# 3. 獲取 datetime 對象(本地時(shí)間)

local_dt = datetime.now()

print(f"本地時(shí)間 datetime 對象:{local_dt}")  # 輸出:2024-05-20 13:14:52.123456

# 4. 獲取 UTC 時(shí)間 datetime 對象

utc_dt = datetime.utcnow()

print(f"UTC 時(shí)間 datetime 對象:{utc_dt}")  # 輸出:2024-05-20 05:14:52.123456

(2)datetime 對象 → 字符串(格式化核心)

使用 datetime.strftime(format) 方法,通過格式化符定義輸出格式,常用格式化符如下:

格式化符說明示例
%Y4 位年份2024
%m2 位月份(01-12)05
%d2 位日期(01-31)20
%H24 小時(shí)制(00-23)13
%I12 小時(shí)制(01-12)01
%M2 位分鐘(00-59)14
%S2 位秒數(shù)(00-59)52
%w星期(0-6,0 為周日)1(周一)
%W當(dāng)年第幾周(00-53)20
%p上午 / 下午(AM/PM,僅 12 小時(shí)制)PM

示例

from datetime import datetime

dt = datetime.now()

# 格式1:年月日 時(shí)分秒(最常用)

str1 = dt.strftime("%Y-%m-%d %H:%M:%S")

print(str1)  # 輸出:2024-05-20 13:14:52

# 格式2:年月日(無時(shí)間)

str2 = dt.strftime("%Y/%m/%d")

print(str2)  # 輸出:2024/05/20

# 格式3:帶星期和上午/下午

str3 = dt.strftime("%Y-%m-%d %A %I:%M:%S %p")

print(str3)  # 輸出:2024-05-20 Monday 01:14:52 PM

# 格式4:自定義分隔符(如下劃線)

str4 = dt.strftime("%Y_%m_%d_%H%M%S")

print(str4)  # 輸出:2024_05_20_131452(適合文件名)

(3)字符串 → datetime 對象(解析時(shí)間)

使用 datetime.strptime(string, format) 方法,format 必須與字符串格式完全一致,否則報(bào)錯(cuò)。

示例

from datetime import datetime

# 示例1:解析標(biāo)準(zhǔn)格式字符串

str_time1 = "2024-05-20 13:14:52"

dt1 = datetime.strptime(str_time1, "%Y-%m-%d %H:%M:%S")

print(f"解析結(jié)果:{dt1},類型:{type(dt1)}")  # 輸出:2024-05-20 13:14:52,類型:.datetime'>

# 示例2:解析無分隔符格式

str_time2 = "20240520131452"

dt2 = datetime.strptime(str_time2, "%Y%m%d%H%M%S")

print(f"解析結(jié)果:{dt2}")  # 輸出:2024-05-20 13:14:52

# 示例3:解析帶中文的格式

str_time3 = "2024年05月20日 13時(shí)14分52秒"

dt3 = datetime.strptime(str_time3, "%Y年%m月%d日 %H時(shí)%M分%S秒")

print(f"解析結(jié)果:{dt3}")  # 輸出:2024-05-20 13:14:52

(4)時(shí)間戳 ↔ datetime 對象

import time

from datetime import datetime

# 1. 時(shí)間戳 → datetime 對象(本地時(shí)間)

timestamp = 1716202492.123456

dt_local = datetime.fromtimestamp(timestamp)

print(f"本地時(shí)間:{dt_local}")  # 輸出:2024-05-20 13:14:52.123456

# 2. 時(shí)間戳 → datetime 對象(UTC 時(shí)間)

dt_utc = datetime.utcfromtimestamp(timestamp)

print(f"UTC 時(shí)間:{dt_utc}")  # 輸出:2024-05-20 05:14:52.123456

# 3. datetime 對象 → 時(shí)間戳

dt = datetime.now()

timestamp = dt.timestamp()

print(f"時(shí)間戳:{timestamp}")  # 輸出:1716202492.123456

三、進(jìn)階技巧:時(shí)區(qū)處理與日期運(yùn)算

1. 時(shí)區(qū)處理(Python3.9+ 推薦zoneinfo)

Python3.9 之前需安裝 pytzpip install pytz),3.9+ 內(nèi)置 zoneinfo(無需額外安裝),支持全球時(shí)區(qū)轉(zhuǎn)換。

(1)獲取指定時(shí)區(qū)的當(dāng)前時(shí)間

from datetime import datetime

from zoneinfo import ZoneInfo  # Python3.9+ 內(nèi)置

# 1. 獲取紐約時(shí)間(UTC-4/UTC-5,自動(dòng)適配夏令時(shí))

ny_tz = ZoneInfo("America/New_York")

ny_dt = datetime.now(ny_tz)

print(f"紐約時(shí)間:{ny_dt.strftime('%Y-%m-%d %H:%M:%S')}")  # 輸出:2024-05-20 01:14:52

# 2. 獲取東京時(shí)間(UTC+9)

tokyo_tz = ZoneInfo("Asia/Tokyo")

tokyo_dt = datetime.now(tokyo_tz)

print(f"東京時(shí)間:{tokyo_dt.strftime('%Y-%m-%d %H:%M:%S')}")  # 輸出:2024-05-20 14:14:52

# 3. 獲取北京時(shí)間(UTC+8)

bj_tz = ZoneInfo("Asia/Shanghai")

bj_dt = datetime.now(bj_tz)

print(f"北京時(shí)間:{bj_dt.strftime('%Y-%m-%d %H:%M:%S')}")  # 輸出:2024-05-20 13:14:52

(2)時(shí)區(qū)轉(zhuǎn)換(如 UTC 轉(zhuǎn)北京時(shí)間)

from datetime import datetime

from zoneinfo import ZoneInfo

# 1. 創(chuàng)建 UTC 時(shí)間對象

utc_dt = datetime(2024, 5, 20, 5, 14, 52, tzinfo=ZoneInfo("UTC"))

print(f"UTC 時(shí)間:{utc_dt}")  # 輸出:2024-05-20 05:14:52+00:00

# 2. 轉(zhuǎn)換為北京時(shí)間(UTC+8)

bj_dt = utc_dt.astimezone(ZoneInfo("Asia/Shanghai"))

print(f"北京時(shí)間:{bj_dt.strftime('%Y-%m-%d %H:%M:%S')}")  # 輸出:2024-05-20 13:14:52

2. 日期運(yùn)算(timedelta類)

使用 datetime.timedelta 實(shí)現(xiàn)「加減天數(shù) / 小時(shí) / 分鐘」等運(yùn)算,無需手動(dòng)處理月份天數(shù)、閏年等問題。

示例

from datetime import datetime, timedelta

now = datetime.now()

# 1. 加 3 天

future_3d = now + timedelta(days=3)

print(f"3 天后:{future_3d.strftime('%Y-%m-%d')}")  # 輸出:2024-05-23

# 2. 減 1 小時(shí) 30 分鐘

past_1h30m = now - timedelta(hours=1, minutes=30)

print(f"1 小時(shí) 30 分鐘前:{past_1h30m.strftime('%Y-%m-%d %H:%M')}")  # 輸出:2024-05-20 11:44

# 3. 計(jì)算兩個(gè)日期的差值

date1 = datetime(2024, 5, 20)

date2 = datetime(2024, 5, 10)

diff = date1 - date2

print(f"日期差值:{diff.days} 天")  # 輸出:10 天

print(f"總秒數(shù):{diff.total_seconds()} 秒")  # 輸出:864000.0 秒

# 4. 加 1 個(gè)月(timedelta 不支持 months,需用 relativedelta)

# 安裝:pip install python-dateutil

from dateutil.relativedelta import relativedelta

future_1m = now + relativedelta(months=1)

print(f"1 個(gè)月后:{future_1m.strftime('%Y-%m-%d')}")  # 輸出:2024-06-20

四、場景:格式化時(shí)間的高頻用法

1. 生成帶時(shí)間戳的文件名(日志 / 備份場景)

from datetime import datetime

# 生成格式:20240520_131452_backup.zip

filename = f"{datetime.now().strftime('%Y%m%d_%H%M%S')}_backup.zip"

print(filename)  # 輸出:20240520_131452_backup.zip

2. 計(jì)算程序運(yùn)行時(shí)間

import time

from datetime import datetime

# 方法1:用 time 模塊(簡潔)

start_time = time.time()

# 模擬程序運(yùn)行(如循環(huán))

for _ in range(1000000):

   pass

end_time = time.time()

print(f"程序運(yùn)行時(shí)間:{end_time - start_time:.6f} 秒")  # 輸出:0.031250 秒

# 方法2:用 datetime 模塊(可讀性強(qiáng))

start_dt = datetime.now()

for _ in range(1000000):

   pass

end_dt = datetime.now()

diff = end_dt - start_dt

print(f"程序運(yùn)行時(shí)間:{diff.total_seconds():.6f} 秒")  # 輸出:0.031250 秒

3. 格式化數(shù)據(jù)庫時(shí)間(ORM 場景)

數(shù)據(jù)庫存儲時(shí)間常用 datetime 類型,查詢后格式化輸出:

from datetime import datetime

import pymysql

# 連接數(shù)據(jù)庫(示例)

conn = pymysql.connect(host="localhost", user="root", password="123456", db="test")

cursor = conn.cursor()

# 查詢數(shù)據(jù)庫中的時(shí)間字段(假設(shè)字段 create_time 為 datetime 類型)

cursor.execute("SELECT create_time FROM user WHERE id = 1")

result = cursor.fetchone()

if result:

   db_time = result[0]  # 數(shù)據(jù)庫返回的是 datetime 對象

   # 格式化輸出

   formatted_time = db_time.strftime("%Y-%m-%d %H:%M:%S")

   print(f"用戶創(chuàng)建時(shí)間:{formatted_time}")  # 輸出:2024-05-20 13:14:52

cursor.close()

conn.close()

4. 處理前端傳遞的時(shí)間字符串

前端通常傳遞字符串格式的時(shí)間,后端解析后進(jìn)行運(yùn)算或存儲:

from datetime import datetime

# 前端傳遞的時(shí)間字符串

front_time_str = "2024-05-20T13:14:52"  # 常見于 JSON 數(shù)據(jù)

# 解析為 datetime 對象

dt = datetime.strptime(front_time_str, "%Y-%m-%dT%H:%M:%S")

# 加 1 天後返回給前端

next_day_dt = dt + timedelta(days=1)

front_response_str = next_day_dt.strftime("%Y-%m-%dT%H:%M:%S")

print(f"返回前端的時(shí)間:{front_response_str}")  # 輸出:2024-05-21T13:14:52

五、避坑指南:常見問題與解決方案

1. 問題:格式化符大小寫混淆(如%mvs%M)

錯(cuò)誤示例:把「月份」的 %m 和「分鐘」的 %M 混用,導(dǎo)致解析失??;

解決方案:牢記核心格式化符的大小寫:

  • 大寫:%Y(年份)、%M(分鐘)、%H(24 小時(shí)制)、%S(秒);
  • 小寫:%y(兩位年份)、%m(月份)、%h(12 小時(shí)制,同 %I)、%s(無意義,別用)。

2. 問題:字符串與 format 不匹配(ValueError)

錯(cuò)誤示例:datetime.strptime("2024-05-20", "%Y/%m/%d")(分隔符不一致);

解決方案:

  • 嚴(yán)格保證 strptime 的第二個(gè)參數(shù)與字符串格式完全一致(分隔符、位數(shù)、單位);
  • 若字符串格式不固定,先預(yù)處理(如替換分隔符):
str_time = "2024-05-20"

str_time = str_time.replace("-", "/")  # 統(tǒng)一分隔符

dt = datetime.strptime(str_time, "%Y/%m/%d")

3. 問題:時(shí)區(qū)缺失導(dǎo)致的時(shí)間偏差

現(xiàn)象:本地時(shí)間存儲到數(shù)據(jù)庫后,查詢時(shí)時(shí)間少 8 小時(shí)(如北京時(shí)間未帶時(shí)區(qū),被解析為 UTC 時(shí)間);

解決方案:

  • 存儲時(shí)間時(shí)統(tǒng)一使用 UTC 時(shí)間(避免時(shí)區(qū)差異);
  • 前端展示時(shí)再轉(zhuǎn)換為用戶所在時(shí)區(qū);
  • 數(shù)據(jù)庫字段建議設(shè)置為 TIMESTAMP WITH TIME ZONE(如 PostgreSQL)或 DATETIME(MySQL 需手動(dòng)處理時(shí)區(qū))。

4. 問題:Python3.9 以下不支持zoneinfo

解決方案:

  • 升級 Python 到 3.9+(推薦);
  • 安裝 pytz 替代:
import pytz

from datetime import datetime

bj_tz = pytz.timezone("Asia/Shanghai")

bj_dt = datetime.now(bj_tz)

print(bj_dt.strftime("%Y-%m-%d %H:%M:%S"))  # 輸出:2024-05-20 13:14:52

5. 問題:timedelta不支持月份 / 年份運(yùn)算

  • 原因:月份天數(shù)不固定(28/29/30/31)、年份有閏年,timedelta 無法處理;
  • 解決方案:使用 python-dateutilrelativedelta
from dateutil.relativedelta import relativedelta

from datetime import datetime

now = datetime.now()

next_year = now + relativedelta(years=1)  # 加 1 年

last_month = now - relativedelta(months=1)  # 減 1 個(gè)月

以上就是Python處理時(shí)間格式化的操作指南的詳細(xì)內(nèi)容,更多關(guān)于Python處理時(shí)間格式化的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

巴林右旗| 合山市| 阿城市| 贵港市| 拉孜县| 平凉市| 伊吾县| 伊金霍洛旗| 永修县| 深水埗区| 开鲁县| 鄢陵县| 山阳县| 万全县| 漳平市| 河津市| 灵宝市| 桃源县| 滦平县| 如皋市| 上林县| 呼伦贝尔市| 航空| 榆树市| 蓬莱市| 威海市| 叙永县| 伽师县| 和硕县| 扶绥县| 梁平县| 京山县| 沂源县| 女性| 义马市| 昌都县| 西乌珠穆沁旗| 乌兰察布市| 甘德县| 昌吉市| 泊头市|