4. python time和datetime模块
time()
1. 模块概述
time
模块主要处理以下内容:
- 时间戳(Timestamp):从1970年1月1日00:00:00 UTC开始的秒数(浮点数)。
- 结构化时间(struct_time):由9个字段组成的元组,表示时间的各个部分(年、月、日等)。
- 格式化时间字符串:如
"2023-10-01 12:30:45"
。
2. 常用函数
(1) 获取时间
-
time.time()
返回当前时间的时间戳(浮点数)。import time timestamp = time.time() # 示例输出:1696141200.123456
-
time.ctime([secs])
将时间戳转换为可读的本地时间字符串。若未提供参数,默认使用当前时间。time_str = time.ctime() # 输出:'Sat Oct 1 12:30:45 2023'
-
time.gmtime([secs])
将时间戳转换为UTC时区的struct_time
对象。默认使用当前时间。utc_time = time.gmtime()
-
time.localtime([secs])
将时间戳转换为本地时区的struct_time
对象。默认使用当前时间。local_time = time.localtime()
(2) 程序休眠
-
time.sleep(secs)
暂停程序执行secs
秒(可以是浮点数)。time.sleep(2.5) # 休眠2.5秒
(3) 时间格式转换
-
time.mktime(t)
将本地时间的struct_time
转换为时间戳。timestamp = time.mktime(local_time)
-
time.strftime(format[, t])
将struct_time
转换为格式化的字符串。若未提供t
,默认使用localtime()
。formatted = time.strftime("%Y-%m-%d %H:%M:%S", local_time) # 示例输出:'2023-10-01 12:30:45'
-
time.strptime(string, format)
将格式化字符串解析为struct_time
。parsed_time = time.strptime("2023-10-01", "%Y-%m-%d")
(4) 性能计时
-
time.perf_counter()
返回高精度的性能计时器值(包含睡眠时间),用于测量代码执行时间。start = time.perf_counter() # 执行代码... end = time.perf_counter() print(f"耗时:{end - start}秒")
-
time.process_time()
返回当前进程的CPU时间(不包含睡眠时间),用于分析CPU使用率。
3. struct_time 结构
struct_time
是一个包含9个字段的元组:
索引 | 属性 | 描述 | 取值范围 |
---|---|---|---|
0 | tm_year |
年份(如2023) | 正整数 |
1 | tm_mon |
月份 | 1-12 |
2 | tm_mday |
日 | 1-31 |
3 | tm_hour |
小时 | 0-23 |
4 | tm_min |
分钟 | 0-59 |
5 | tm_sec |
秒 | 0-61(闰秒) |
6 | tm_wday |
星期几(0=周一) | 0-6 |
7 | tm_yday |
一年中的第几天 | 1-366 |
8 | tm_isdst |
夏令时标志(0/1/-1) | -1(未知) |
4. 时间格式化符号
在 strftime
和 strptime
中使用的常见格式指令:
符号 | 说明 | 示例 |
---|---|---|
%Y |
年份(4位数) | 2023 |
%m |
月份(01-12) | 10 |
%d |
日(01-31) | 01 |
%H |
小时(00-23) | 14 |
%M |
分钟(00-59) | 30 |
%S |
秒(00-59) | 45 |
%A |
完整的星期名称 | Monday |
%a |
简写的星期名称 | Mon |
%B |
完整的月份名称 | October |
%b |
简写的月份名称 | Oct |
%p |
AM/PM | AM |
%Z |
时区名称 | UTC |
5. 示例代码
(1) 获取并格式化当前时间
import timenow = time.localtime()
formatted = time.strftime("%Y-%m-%d %H:%M:%S", now)
print(formatted) # 输出:2023-10-01 12:30:45
(2) 计算代码执行时间
start = time.perf_counter()
time.sleep(1)
end = time.perf_counter()
print(f"耗时:{end - start}秒") # 输出:1.000123秒
(3) 解析时间字符串
time_str = "2023-10-01"
parsed = time.strptime(time_str, "%Y-%m-%d")
print(parsed.tm_year) # 输出:2023
6. 注意事项
- 时区问题:
gmtime()
返回UTC时间,localtime()
返回本地时间。 - 时间戳精度:
time.time()
在Windows系统下精度较低(约0.001秒),而time.perf_counter()
提供更高精度。 - 夏令时处理:
tm_isdst
字段可能影响本地时间的转换。
通过掌握这些内容,可以高效地使用 time
模块处理各种时间相关任务。
datetime()
1. 模块概述
datetime
模块包含以下主要类:
datetime.date
:处理日期(年、月、日)。datetime.time
:处理时间(时、分、秒、微秒)。datetime.datetime
:日期和时间的组合(最常用)。datetime.timedelta
:表示时间间隔(如天、秒、微秒)。datetime.tzinfo
:时区信息的基类(需自定义或使用第三方库如pytz
)。
2. 常用类及方法
(1) datetime.date
-
创建日期对象:
from datetime import date d = date(2023, 10, 1) # 年、月、日
-
常用属性和方法:
print(d.year) # 2023 print(d.month) # 10 print(d.day) # 1 print(d.weekday()) # 返回星期几(0=周一,6=周日) print(d.isoformat()) # 返回ISO格式字符串 "2023-10-01"
(2) datetime.time
-
创建时间对象:
from datetime import time t = time(12, 30, 45) # 时、分、秒、微秒(可选)
-
常用属性和方法:
print(t.hour) # 12 print(t.minute) # 30 print(t.second) # 45 print(t.isoformat()) # "12:30:45"
(3) datetime.datetime
(最常用)
-
创建日期时间对象:
from datetime import datetime dt = datetime(2023, 10, 1, 12, 30, 45) # 年、月、日、时、分、秒
-
常用方法:
-
获取当前时间:
now = datetime.now() # 本地当前时间 utc_now = datetime.utcnow() # UTC当前时间
-
日期时间拆分:
print(now.year, now.month, now.day) print(now.hour, now.minute, now.second)
-
转换为时间戳:
timestamp = now.timestamp() # 返回浮点型时间戳
-
从时间戳创建:
dt = datetime.fromtimestamp(1696141200.0) # 本地时间 dt_utc = datetime.utcfromtimestamp(1696141200.0) # UTC时间
-
格式化输出:
formatted = now.strftime("%Y-%m-%d %H:%M:%S") # "2023-10-01 12:30:45"
-
解析字符串:
parsed = datetime.strptime("2023-10-01 12:30", "%Y-%m-%d %H:%M")
-
(4) datetime.timedelta
表示时间间隔,用于日期时间的加减:
from datetime import datetime, timedeltanow = datetime.now()
# 加减时间
future = now + timedelta(days=3, hours=2) # 3天2小时后
past = now - timedelta(weeks=1) # 1周前# 计算时间差
diff = future - past
print(diff.days) # 10(天数差)
print(diff.seconds) # 7200(秒数差,2小时=7200秒)
3. 时区处理
Python内置的 datetime.timezone
类(Python 3.2+)支持简单时区操作,但更复杂的时区需使用第三方库 pytz
。
(1) 使用 datetime.timezone
from datetime import datetime, timezone, timedelta# 创建带时区的日期时间
utc_time = datetime.now(timezone.utc) # UTC时间
# 自定义时区(东八区)
tz = timezone(timedelta(hours=8))
local_time = datetime.now(tz)
(2) 使用 pytz
(推荐)
安装:pip install pytz
import pytz
from datetime import datetime# 创建带时区的日期时间
tz_shanghai = pytz.timezone('Asia/Shanghai')
dt = datetime.now(tz_shanghai)# 时区转换
utc_dt = dt.astimezone(pytz.utc) # 转换为UTC时间
4. 时间格式化符号
与 time
模块类似,常用符号如下:
符号 | 说明 | 示例 |
---|---|---|
%Y |
4位年份 | 2023 |
%m |
月份(01-12) | 10 |
%d |
日(01-31) | 01 |
%H |
小时(00-23) | 14 |
%M |
分钟(00-59) | 30 |
%S |
秒(00-59) | 45 |
%f |
微秒(000000-999999) | 123456 |
%A |
完整星期名 | Monday |
%a |
简写星期名 | Mon |
%B |
完整月份名 | October |
%b |
简写月份名 | Oct |
%z |
时区偏移(+HHMM/-HHMM) | +0800 |
%Z |
时区名称 | CST |
5. 示例代码
(1) 计算两个日期的差值
from datetime import datetimedate1 = datetime(2023, 10, 1)
date2 = datetime(2023, 10, 10)
delta = date2 - date1
print(delta.days) # 输出:9
(2) 生成最近一周的日期列表
from datetime import datetime, timedeltanow = datetime.now()
dates = [now - timedelta(days=i) for i in range(7)]
for d in dates:print(d.strftime("%Y-%m-%d"))
(3) 带时区的时间转换
import pytz
from datetime import datetime# 创建上海时区时间
tz_sh = pytz.timezone('Asia/Shanghai')
dt_sh = datetime.now(tz_sh)
print(dt_sh.isoformat()) # 输出:2023-10-01T14:30:45+08:00# 转换为纽约时区
tz_ny = pytz.timezone('America/New_York')
dt_ny = dt_sh.astimezone(tz_ny)
print(dt_ny.isoformat()) # 输出:2023-10-01T02:30:45-04:00
6. 注意事项
- 时区处理:默认的
datetime
对象是“无时区”的(naive),建议始终使用带时区的对象(aware)。 - 性能:频繁的日期计算推荐使用
timedelta
,避免循环中重复创建对象。 - 月份和日期范围:如
date(2023, 2, 30)
会抛出ValueError
(2月无30日)。 - 第三方库:处理复杂时区时,优先使用
pytz
而非内置模块。
7. 总结
datetime
vstime
模块:datetime
更适合日期时间的复杂操作(如时区、时间差)。time
模块更底层,适合处理时间戳和简单休眠。
- 核心操作:
- 日期时间创建、格式化、解析。
- 时间差计算(
timedelta
)。 - 时区转换(结合
pytz
)。
掌握 datetime
模块后,可以高效处理大多数日期时间相关的业务需求。