Python 时间模块深度解析:从基础到高级的全面指南
直接上干货
一、时间模块核心类介绍
序号 | 类名 | 说明 |
1 | datetime.datetime | 表示一个具体的日期和时间,结合了日期和时间的信息。 |
2 | datetime.date | 表示一个具体的日期。 |
3 | datetime.time | 表示一个具体的时间。 |
4 | datetime.timedelta | 表示两个日期或时间之间的时间差。 |
5 | datetime.tzinfo | 抽象基类,用于表示时区信息。 |
6 | datetime.timezone | 具体实现的 tzinfo 子类,用于表示固定的 UTC 偏移量。 |
7 | time | 提供了与时间相关的函数和方法。 |
- datetime.datetime
- 说明:表示一个具体的日期和时间,结合了日期和时间的信息。示例代码:from datetime import datetime
dt = datetime(2024, 10, 11, 12, 30, 0)
print(dt) # 输出:2024-10-11 12:30:00
- datetime.date
- 说明:表示一个具体的日期。示例代码:from datetime import date
d = date(2024, 10, 11)
print(d) # 输出:2024-10-11
- datetime.time
- 说明:表示一个具体的时间。示例代码:from datetime import time
t = time(12, 30, 0)
print(t) # 输出:12:30:00
- datetime.timedelta
- 说明:表示两个日期或时间之间的时间差。示例代码:from datetime import timedelta
delta = timedelta(days=5, hours=3)
print(delta) # 输出:5 days, 3:00:00
- datetime.tzinfo
- 说明:抽象基类,用于表示时区信息。
- datetime.timezone
- 说明:具体实现的tzinfo子类,用于表示固定的UTC偏移量。示例代码:from datetime import timezone, timedelta
tz = timezone(timedelta(hours=8))
print(tz) # 输出:datetime.timezone(datetime.timedelta(seconds=28800))
- time
- 说明:提供了与时间相关的函数和方法。
二、datetime 类
构造方法
- datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
- 说明:创建一个指定日期和时间的对象。示例代码:from datetime import datetime
dt = datetime(2024, 10, 11, 12, 30, 0)
print(dt) # 输出:2024-10-11 12:30:00
常用方法
序号 | 方法名 | 说明 |
1 | today() | 返回当前本地日期和时间,tzinfo 为 None。 |
2 | now(tz=None) | 返回当前本地日期和时间,可指定时区。 |
3 | utcnow() | 获取当前国际标准时间(UTC)的日期和时间。 |
4 | fromtimestamp(timestamp, tz=None) | 从时间戳创建一个 datetime 对象。 |
5 | combine(date, time) | 将 date 和 time 组合成一个 datetime 对象。 |
6 | astimezone(tz) | 将 datetime 对象转换为指定时区。 |
7 | replace() | 创建一个新的 datetime 对象,替换指定的属性。 |
8 | strftime(format) | 将 datetime 对象格式化为字符串。 |
9 | strptime(date_string, format) | 从字符串解析为 datetime 对象。 |
10 | isoformat() | 将 datetime 对象格式化为 ISO 8601 标准的字符串。 |
- today()
- 说明:返回当前本地日期和时间,tzinfo为None。示例代码:from datetime import datetime
dt_today = datetime.today()
print(dt_today) # 输出:当前的日期和时间
- now(tz=None)
- 说明:返回当前本地日期和时间,可指定时区。示例代码:from datetime import datetime
dt_now = datetime.now()
print(dt_now) # 输出:当前的日期和时间
- utcnow()
- 说明:获取当前国际标准时间(UTC)的日期和时间。示例代码:from datetime import datetime
dt_utcnow = datetime.utcnow()
print(dt_utcnow) # 输出:当前的 UTC 日期和时间
- fromtimestamp(timestamp, tz=None)
- 说明:从时间戳创建一个datetime对象。示例代码:from datetime import datetime
import time
timestamp = time.time()
dt_fromtimestamp = datetime.fromtimestamp(timestamp)
print(dt_fromtimestamp) # 输出:从时间戳转换的日期和时间
- combine(date, time)
- 说明:将date和time组合成一个datetime对象。示例代码:from datetime import datetime, date, time
dt_date = date(2024, 10, 11)
dt_time = time(12, 30, 0)
dt_combine = datetime.combine(dt_date, dt_time)
print(dt_combine) # 输出:2024-10-11 12:30:00
- astimezone(tz)
- 说明:将datetime对象转换为指定时区。示例代码:from datetime import datetime, timezone
dt = datetime.now()
tz = timezone(timedelta(hours=8))
dt_astimezone = dt.astimezone(tz)
print(dt_astimezone) # 输出:转换为指定时区的日期和时间
- replace()
- 说明:创建一个新的datetime对象,替换指定的属性。示例代码:from datetime import datetime
dt = datetime(2024, 10, 11, 12, 30, 0)
dt_replace = dt.replace(year=2025, month=11)
print(dt_replace) # 输出:2025-11-11 12:30:00
- strftime(format)
- 说明:将datetime对象格式化为字符串。示例代码:from datetime import datetime
dt = datetime(2024, 10, 11, 12, 30, 0)
dt_strftime = dt.strftime("%Y-%m-%d %H:%M:%S")
print(dt_strftime) # 输出:2024-10-11 12:30:00
- strptime(date_string, format)
- 说明:从字符串解析为datetime对象。示例代码:from datetime import datetime
date_string = "2024-10-11 12:30:00"
dt_strptime = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(dt_strptime) # 输出:2024-10-11 12:30:00
- isoformat()
- 说明:将datetime对象格式化为 ISO 8601 标准的字符串。示例代码:from datetime import datetime
dt = datetime(2024, 10, 11, 12, 30, 0)
dt_isoformat = dt.isoformat()
print(dt_isoformat) # 输出:2024-10-11T12:30:00
常用属性
序号 | 属性名 | 说明 |
1 | year | 年份。 |
2 | month | 月份。 |
3 | day | 日期。 |
4 | hour | 小时。 |
5 | minute | 分钟。 |
6 | second | 秒。 |
7 | microsecond | 微秒。 |
8 | tzinfo | 时区信息。 |
9 | fold | 表示是否处于夏令时。 |
- year
- 说明:年份。示例代码:from datetime import datetime
dt = datetime(2024, 10, 11, 12, 30, 0)
print(dt.year) # 输出:2024
- month
- 说明:月份。示例代码:from datetime import datetime
dt = datetime(2024, 10, 11, 12, 30, 0)
print(dt.month) # 输出:10
- day
- 说明:日期。示例代码:from datetime import datetime
dt = datetime(2024, 10, 11, 12, 30, 0)
print(dt.day) # 输出:11
- hour
- 说明:小时。示例代码:from datetime import datetime
dt = datetime(2024, 10, 11, 12, 30, 0)
print(dt.hour) # 输出:12
- minute
- 说明:分钟。示例代码:from datetime import datetime
dt = datetime(2024, 10, 11, 12, 30, 0)
print(dt.minute) # 输出:30
- second
- 说明:秒。示例代码:from datetime import datetime
dt = datetime(2024, 10, 11, 12, 30, 0)
print(dt.second) # 输出:0
- microsecond
- 说明:微秒。示例代码:from datetime import datetime
dt = datetime(2024, 10, 11, 12, 30, 0, 123456)
print(dt.microsecond) # 输出:123456
- tzinfo
- 说明:时区信息。示例代码:from datetime import datetime, timezone
tz = timezone(timedelta(hours=8))
dt = datetime(2024, 10, 11, 12, 30, 0, tzinfo=tz)
print(dt.tzinfo) # 输出:datetime.timezone(datetime.timedelta(seconds=28800))
- fold
- 说明:表示是否处于夏令时。示例代码:from datetime import datetime
dt = datetime(2024, 10, 11, 12, 30, 0, fold=1)
print(dt.fold) # 输出:1
三、date 类
构造方法
- date(year, month, day)
- 说明:创建一个指定日期的对象。示例代码:from datetime import date
d = date(2024, 10, 11)
print(d) # 输出:2024-10-11
常用方法
序号 | 方法名 | 说明 |
1 | today() | 获取当前日期,tzinfo 为 None。 |
2 | fromtimestamp(timestamp) | 从时间戳创建一个 date 对象。 |
3 | replace() | 创建一个新的 date 对象,替换指定的属性。 |
4 | strftime(format) | 将 date 对象格式化为字符串。 |
5 | isoformat() | 将 date 对象格式化为 ISO 8601 标准的字符串。 |
- today()
- 说明:获取当前日期,tzinfo为None。示例代码:from datetime import date
d_today = date.today()
print(d_today) # 输出:当前的日期
- fromtimestamp(timestamp)
- 说明:从时间戳创建一个date对象。示例代码:from datetime import date
import time
timestamp = time.time()
d_fromtimestamp = date.fromtimestamp(timestamp)
print(d_fromtimestamp) # 输出:从时间戳转换的日期
- replace()
- 说明:创建一个新的date对象,替换指定的属性。示例代码:from datetime import date
d = date(2024, 10, 11)
d_replace = d.replace(year=2025, month=11)
print(d_replace) # 输出:2025-11-11
- strftime(format)
- 说明:将date对象格式化为字符串。示例代码:from datetime import date
d = date(2024, 10, 11)
d_strftime = d.strftime("%Y-%m-%d")
print(d_strftime) # 输出:2024-10-11
- isoformat()
- 说明:将date对象格式化为 ISO 8601 标准的字符串。示例代码:from datetime import date
d = date(2024, 10, 11)
d_isoformat = d.isoformat()
print(d_isoformat) # 输出:2024-10-11
常用属性
序号 | 属性名 | 说明 |
1 | year | 年份。 |
2 | month | 月份。 |
3 | day | 日期。 |
- year
- 说明:年份。示例代码:from datetime import date
d = date(2024, 10, 11)
print(d.year) # 输出:2024
- month
- 说明:月份。示例代码:from datetime import date
d = date(2024, 10, 11)
print(d.month) # 输出:10
- day
- 说明:日期。示例代码:from datetime import date
d = date(2024, 10, 11)
print(d.day) # 输出:11
四、time 类
构造方法
- time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
- 说明:创建一个指定时间的对象。示例代码:from datetime import time
t = time(12, 30, 0)
print(t) # 输出:12:30:00
常用方法
序号 | 方法名 | 说明 |
1 | replace() | 创建一个新的 time 对象,替换指定的属性。 |
2 | strftime(format) | 将 time 对象格式化为字符串。 |
3 | isoformat() | 将 time 对象格式化为 ISO 8601 标准的字符串。 |
- replace()
- 说明:创建一个新的time对象,替换指定的属性。示例代码:from datetime import time
t = time(12, 30, 0)
t_replace = t.replace(hour=13, minute=45)
print(t_replace) # 输出:13:45:00
- strftime(format)
- 说明:将time对象格式化为字符串。示例代码:from datetime import time
t = time(12, 30, 0)
t_strftime = t.strftime("%H:%M:%S")
print(t_strftime) # 输出:12:30:00
- isoformat()
- 说明:将time对象格式化为 ISO 8601 标准的字符串。示例代码:from datetime import time
t = time(12, 30, 0)
t_isoformat = t.isoformat()
print(t_isoformat) # 输出:12:30:00
常用属性
序号 | 属性名 | 说明 |
1 | hour | 小时。 |
2 | minute | 分钟。 |
3 | second | 秒。 |
4 | microsecond | 微秒。 |
5 | tzinfo | 时区信息。 |
6 | fold | 表示是否处于夏令时。 |
- hour
- 说明:小时。示例代码:from datetime import time
t = time(12, 30, 0)
print(t.hour) # 输出:12
- minute
- 说明:分钟。示例代码:from datetime import time
t = time(12, 30, 0)
print(t.minute) # 输出:30
- second
- 说明:秒。示例代码:from datetime import time
t = time(12, 30, 0)
print(t.second) # 输出:0
- microsecond
- 说明:微秒。示例代码:from datetime import time
t = time(12, 30, 0, 123456)
print(t.microsecond) # 输出:123456
- tzinfo
- 说明:时区信息。示例代码:from datetime import time, timezone
tz = timezone(timedelta(hours=8))
t = time(12, 30, 0, tzinfo=tz)
print(t.tzinfo) # 输出:datetime.timezone(datetime.timedelta(seconds=28800))
- fold
- 说明:表示是否处于夏令时。示例代码:from datetime import time
t = time(12, 30, 0, fold=1)
print(t.fold) # 输出:1
五、timedelta 类
构造方法
- timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
- 说明:创建一个表示时间差的对象。示例代码:from datetime import timedelta
delta = timedelta(days=5, hours=3)
print(delta) # 输出:5 days, 3:00:00
常用方法
序号 | 方法名 | 说明 |
1 | total_seconds() | 获取时间差的总秒数。 |
- total_seconds()
- 说明:获取时间差的总秒数。示例代码:from datetime import timedelta
delta = timedelta(days=5, hours=3)
print(delta.total_seconds()) # 输出:451800.0
常用属性
序号 | 属性名 | 说明 |
1 | days | 天数。 |
2 | seconds | 秒数。 |
3 | microseconds | 微秒数。 |
六、tzinfo 类
常用方法
序号 | 方法名 | 说明 |
1 | utcoffset(dt) | 返回相对于 UTC 的偏移量。 |
2 | tzname(dt) | 返回时区名称。 |
3 | dst(dt) | 返回夏令时偏移量。 |
- utcoffset(dt)
- 说明:返回相对于 UTC 的偏移量。示例代码:from datetime import tzinfo, timedelta, datetime
class MyTZ(tzinfo):
def utcoffset(self, dt):
return timedelta(hours=8)
my_tz = MyTZ()
print(my_tz.utcoffset(None)) # 输出:8:00:00
- tzname(dt)
- 说明:返回时区名称。示例代码:from datetime import tzinfo, datetime
class MyTZ(tzinfo):
def tzname(self, dt):
return "Asia/Shanghai"
my_tz = MyTZ()
print(my_tz.tzname(None)) # 输出:Asia/Shanghai
- dst(dt)
- 说明:返回夏令时偏移量。示例代码:from datetime import tzinfo, timedelta, datetime
class MyTZ(tzinfo):
def dst(self, dt):
return timedelta(seconds=0)
my_tz = MyTZ()
print(my_tz.dst(None)) # 输出:0:00:00
七、timezone 类
构造方法
- timezone(offset, name=None)
- 说明:创建一个表示时区的对象。示例代码:from datetime import timezone, timedelta
tz = timezone(timedelta(hours=8))
print(tz) # 输出:datetime.timezone(datetime.timedelta(seconds=28800))
常用方法
序号 | 方法名 | 说明 |
1 | utcoffset(dt) | 返回固定偏移量。 |
2 | fromutc(dt) | 处理时间转换。 |
- utcoffset(dt)
- 说明:返回固定偏移量。示例代码:from datetime import timezone, timedelta
tz = timezone(timedelta(hours=8))
print(tz.utcoffset(None)) # 输出:8:00:00
- fromutc(dt)
- 说明:处理时间转换。示例代码:from datetime import datetime, timezone, timedelta
tz = timezone(timedelta(hours=8))
dt_utc = datetime(2024, 10, 11, 12, 30, 0, tzinfo=timezone.utc)
dt_local = tz.fromutc(dt_utc)
print(dt_local) # 输出:2024-10-11 20:30:00+08:00
八、time 模块
方法
序号 | 方法名 | 说明 |
1 | time() | 返回当前时间戳(浮点数)。 |
2 | time_ns() | 返回当前时间戳(纳秒为单位的整数)。 |
3 | monotonic() | 返回单调递增的时间(不受系统时间调整影响)。 |
4 | perf_counter() | 高精度计时器,包含休眠时间。 |
5 | process_time() | 返回当前进程的系统和用户 CPU 时间总和。 |
6 | thread_time() | 返回当前线程的 CPU 时间。 |
7 | gmtime([secs]) | 将时间戳转换为 UTC 时间的 struct_time。 |
8 | localtime([secs]) | 将时间戳转换为本地时间的 struct_time。 |
9 | mktime(t) | 将 struct_time(本地时间)转换为时间戳。 |
10 | ctime([secs]) | 将时间戳转换为可读字符串。 |
11 | asctime([t]) | 将 struct_time 转换为可读字符串。 |
12 | strftime(format, [t]) | 根据格式字符串格式化时间。 |
13 | strptime(string, format) | 解析字符串为 struct_time。 |
14 | sleep(secs) | 暂停当前线程指定秒数。 |
- time()
- 说明:返回当前时间戳(浮点数)。示例代码:import time
print(time.time()) # 输出:1697040600.123456
- time_ns()
- 说明:返回当前时间戳(纳秒为单位的整数)。示例代码:import time
print(time.time_ns()) # 输出:1697040600123456000
- monotonic()
- 说明:返回单调递增的时间(不受系统时间调整影响)。示例代码:import time
start = time.monotonic()
# 执行操作...
end = time.monotonic()
print(f"耗时:{end - start}秒") # 输出:耗时:...
- perf_counter()
- 说明:高精度计时器,包含休眠时间。示例代码:import time
start = time.perf_counter()
# 执行操作...
end = time.perf_counter()
print(f"耗时:{end - start}秒") # 输出:耗时:...
- process_time()
- 说明:返回当前进程的系统和用户 CPU 时间总和。示例代码:import time
cpu_time = time.process_time()
print(cpu_time) # 输出:...
- thread_time()
- 说明:返回当前线程的 CPU 时间。示例代码:import time
thread_time = time.thread_time()
print(thread_time) # 输出:...
- gmtime([secs])
- 说明:将时间戳转换为 UTC 时间的struct_time。示例代码:import time
utc_time = time.gmtime(1697040600)
print(utc_time) # 输出:struct_time对象
- localtime([secs])
- 说明:将时间戳转换为本地时间的struct_time。示例代码:import time
local_time = time.localtime(1697040600)
print(local_time) # 输出:struct_time对象
- mktime(t)
- 说明:将struct_time(本地时间)转换为时间戳。示例代码:import time
t = time.localtime(1697040600)
timestamp = time.mktime(t)
print(timestamp) # 输出:1697040600.0
- ctime([secs])
- 说明:将时间戳转换为可读字符串。示例代码:import time
print(time.ctime(1697040600)) # 输出:Fri Oct 11 20:30:00 2024
- asctime([t])
- 说明:将struct_time转换为可读字符串。示例代码:import time
t = time.localtime(1697040600)
print(time.asctime(t)) # 输出:Fri Oct 11 20:30:00 2024
- strftime(format, [t])
- 说明:根据格式字符串格式化时间。示例代码:import time
t = time.localtime(1697040600)
formatted = time.strftime("%Y-%m-%d %H:%M:%S", t)
print(formatted) # 输出:2024-10-11 20:30:00
- strptime(string, format)
- 说明:解析字符串为struct_time。示例代码:import time
time_str = "2024-10-11 20:30:00"
t = time.strptime(time_str, "%Y-%m-%d %H:%M:%S")
print(t) # 输出:struct_time对象
- sleep(secs)
- 说明:暂停当前线程指定秒数。示例代码:import time
time.sleep(2.5) # 暂停 2.5 秒
属性
序号 | 属性名 | 说明 |
1 | timezone | 本地时区偏移(秒,UTC 西区时区为正,东区为负)。 |
2 | altzone | 启用夏令时时,时区的替代偏移(秒)。 |
3 | daylight | 非零表示本地时区启用夏令时。 |
4 | tzname | 包含两个字符串的元组:本地时区名称和非夏令时名称。 |
- timezone
- 说明:本地时区偏移(秒,UTC 西区时区为正,东区为负)。示例代码:import time
print(time.timezone) # 输出:-28800
- altzone
- 说明:启用夏令时时,时区的替代偏移(秒)。示例代码:import time
print(time.altzone) # 输出:-28800
- daylight
- 说明:非零表示本地时区启用夏令时。示例代码:import time
print(time.daylight) # 输出:1
- tzname
- 说明:包含两个字符串的元组:本地时区名称和非夏令时名称。示例代码:import time
print(time.tzname) # 输出:('CST', 'CST')
九、struct_time 结构化时间
属性参数
序号 | 属性索引 | 属性名 | 描述 |
1 | 0 | tm_year | 年份 |
2 | 1 | tm_mon | 月份(1-12) |
3 | 2 | tm_mday | 日期(当月第几天) |
4 | 3 | tm_hour | 小时(0-23) |
5 | 4 | tm_min | 分钟(0-59) |
6 | 5 | tm_sec | 秒(0-61) |
7 | 6 | tm_wday | 星期几(0-6) |
8 | 7 | tm_yday | 一年中的第几天 |
9 | 8 | tm_isdst | 夏令时标志 |
- tm_year → 年份
- 示例代码:import time
t = time.localtime(1697040600)
print(t.tm_year) # 输出:2024
- tm_mon → 月份(1-12)
- 示例代码:import time
t = time.localtime(1697040600)
print(t.tm_mon) # 输出:10
- tm_mday → 日期(当月第几天)
- 示例代码:import time
t = time.localtime(1697040600)
print(t.tm_mday) # 输出:11
- tm_hour → 小时(0-23)
- 示例代码:import time
t = time.localtime(1697040600)
print(t.tm_hour) # 输出:20
- tm_min → 分钟(0-59)
- 示例代码:import time
t = time.localtime(1697040600)
print(t.tm_min) # 输出:30
- tm_sec → 秒(0-61)
- 示例代码:import time
t = time.localtime(1697040600)
print(t.tm_sec) # 输出:0
- tm_wday → 星期几(0-6)
- 示例代码:import time
t = time.localtime(1697040600)
print(t.tm_wday) # 输出:4
- tm_yday → 一年中的第几天
- 示例代码:import time
t = time.localtime(1697040600)
print(t.tm_yday) # 输出:284
- tm_isdst → 夏令时标志
- 示例代码:import time
t = time.localtime(1697040600)
print(t.tm_isdst) # 输出:0
十、calendar 模块
方法
序号 | 方法名 | 说明 |
1 | month(year, month) | 返回指定年份和月份的日历字符串。 |
2 | calendar(year) | 返回指定年份的日历字符串。 |
3 | isleap(year) | 判断指定年份是否为闰年。 |
4 | monthrange(year, month) | 返回一个元组,包含该月第一天是星期几和该月的天数。 |
- month(year, month)
- 说明:返回指定年份和月份的日历字符串。示例代码:import calendar
cal = calendar.month(2024, 10)
print(cal)
- calendar(year)
- 说明:返回指定年份的日历字符串。示例代码:import calendar
cal = calendar.calendar(2024)
print(cal)
- isleap(year)
- 说明:判断指定年份是否为闰年。示例代码:import calendar
is_leap = calendar.isleap(2024)
print(is_leap) # 输出:True
- monthrange(year, month)
- 说明:返回一个元组,包含该月第一天是星期几和该月的天数。示例代码:import calendar
first_day, num_days = calendar.monthrange(2024, 10)
print(f"该月第一天是星期 {first_day},该月有 {num_days} 天")
属性
序号 | 属性名 | 说明 |
1 | firstweekday | 设置每周的第一天(0=周一,6=周日)。 |
- firstweekday
- 说明:设置每周的第一天(0=周一,6=周日)。示例代码:import calendar
calendar.firstweekday = 6 # 设置每周的第一天为星期日
十一、注意事项
- 时间精度:time() 在 Unix 系统精度通常为微秒,Windows 为毫秒。
- 时区处理:建议结合 datetime 模块处理复杂时区问题。
- 单调时间:长时间测量推荐使用 monotonic() 或 perf_counter(),避免系统时间调整影响。