Python时间与日期处理:time、datetime与calendar模块详解

键盘旁的猫
键盘旁的猫
发布时间:2026-10-12 | 2人浏览过
原创

Python 没有原生的时间数据类型,而是通过 time、datetime 和 calendar 三个模块来实现时间处理。本文详细解析这三个模块的核心功能、常用函数及操作示例,涵盖从底层时间戳到高级日期对象的各种应用场景。

Python 时间处理基础

在 Python 中,时间处理依赖于三个标准库模块。其中 time 模块主要封装了 C 语言库的时间相关函数;datetime 模块提供了更高级的日期与时间接口;而 calendar 模块则用于处理周期性事件和日历生成。

理解时间处理的关键在于 Epoch(纪元) 的概念。Epoch 是时间计算的起点,其具体值取决于操作系统平台。在 Unix 系统中,Epoch 被定义为 1970年1月1日 00:00:00 (UTC)。程序员通常将自 Epoch 以来经过的总秒数称为 时间戳(Timestamp)。需要注意的是,符合 POSIX 标准的平台在计算总秒数时通常不包括闰秒。

要查看当前平台的 Epoch 信息,可以使用 time.gmtime(0):

time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

time 模块详解

time 模块的核心功能是控制时钟时间。Python 提供了多种时钟类型,可以通过 time.get_clock_info(name) 获取其详细信息。不同系统返回的信息可能存在差异,主要包含以下属性:

  • name:时钟名称,如 monotonic、perf_counter 等。
  • adjustable:布尔值,表示时钟是否可被系统自动更改。
  • implementation:底层 C 函数的名称。
  • monotonic:布尔值,表示时钟是否单调递增(不会倒退)。
  • resolution:时钟的分辨率(以秒为单位)。

以下是获取系统可用时钟信息的示例代码:

import time

available_clocks = [
 ('clock', time.clock),
 ('monotonic', time.monotonic),
 ('perf_counter', time.perf_counter),
 ('process_time', time.process_time),
 ('time', time.time),
]

for clock_name, func in available_clocks:
 print('''
 {name}:
  adjustable : {info.adjustable}
  implementation: {info.implementation}
  monotonic  : {info.monotonic}
  resolution : {info.resolution}
  current  : {current}
 '''.format(
  name=clock_name,
  info=time.get_clock_info(clock_name),
  current=func()))

常用时间函数

time.time() 是最常用的函数之一,它返回自 Epoch 以来的浮点数秒数:

import time
print(time.time())
# 输出结果 1615257195.558105

time.ctime() 将时间戳转换为人类可读的字符串格式:

import time
print(time.ctime())
# 输出内容:Tue Mar 9 10:35:51 2021

若需将时间戳转换为本地时间的结构化对象,可使用 time.localtime()。该函数返回 time.struct_time 类型,包含 tm_year 到 tm_isdst 等字段:

import time

localtime = time.localtime(0)
print("时间为 :", localtime)
# 时间为 : time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

localtime = time.localtime(32536799999)
print("时间为 :", localtime)
# 时间为 : time.struct_time(tm_year=3001, tm_mon=1, tm_mday=19, tm_hour=15, tm_min=59, tm_sec=59, tm_wday=0, tm_yday=19, tm_isdst=0)

# 注意:超出平台支持范围的时间戳会引发异常
localtime = time.localtime(99999999999)
print("时间为 :", localtime)
# OSError: [Errno 22] Invalid argument

单调时钟与性能计数器

time.monotonic() 返回从系统启动开始单调递增的时间(浮点数),不受系统时间调整的影响。这对于测量程序运行时间非常有用:

print("单调时间",time.monotonic())
# 输出:单调时间 12279.244

在 Python 3.8 之前,time.clock() 常用于测量程序运行时间,但该函数已被废弃。现在推荐使用 time.perf_counter() 或 time.process_time()。其中 perf_counter() 的 Epoch 未定义,但精度极高,且包含睡眠状态消耗的时间,适合测量较短持续时间:

t0 = time.perf_counter()
# 运行一段代码
for i in range(100000):
 pass
print("程序运行时间", time.perf_counter() - t0)

UTC 与本地时间转换

time.gmtime() 返回 UTC 时间,而 time.localtime() 返回当前时区的时间。两者均可转换为时间戳,使用 time.mktime() 将 struct_time 转换为浮点型时间戳:

print("*"*10)
print(time.gmtime())
print("*"*10)
print(time.localtime())

print("*"*10)
print(time.mktime(time.localtime()))

输出示例:

time.struct_time(tm_year=2021, tm_mon=3, tm_mday=9, tm_hour=12, tm_min=50, tm_sec=35, tm_wday=1, tm_yday=68, tm_isdst=0)

时间格式化与解析

strftime 和 strptime 用于时间值与字符串之间的相互转换。前者将 struct_time 转为字符串,后者将字符串转为 struct_time:

x = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(x)

反向操作示例:

x = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(x)
# 方向操作,字符串格式化成 time.struct_time
struct_time = time.strptime(x, "%Y-%m-%d %H:%M:%S")
print(struct_time)

datetime 模块详解

datetime 模块是对 time 模块的高级封装,提供了五个主要对象类:

  • datetime:同时操作时间和日期。
  • date:仅操作日期。
  • time:仅操作时间。
  • timedelta:用于操作日期及测量时间跨度。
  • tzinfo:处理时区信息。

date 与 time 对象

date 类定义了最小日期 date.min、最大日期 date.max 以及最小单位 date.resolution(天)。常用方法包括:

  • date.today():返回当前本地日期的 date 对象。
  • date.fromtimestamp():根据时间戳返回 date 对象。
  • d.year, d.month, d.day:获取年、月、日。
  • d.weekday():返回星期几,周一为 0。
  • d.isoweekday():返回星期几,周一为 1。
  • d.isocalendar():返回 (year, wk num, wk day)。
  • d.isoformat():返回 'YYYY-MM-DD' 格式字符串。
  • d.strftime(fmt):自定义格式化字符串。

示例:

from datetime import date
import time
print('date.min:', date.min)
print('date.max:', date.max)
print('date.resolution:', date.resolution)
print('date.today():', date.today())
print('date.fromtimestamp():', date.fromtimestamp(time.time()))

创建特定日期的对象:

d = date(year=2021,month=3,day=9)
print(d)

time 类(注意是 datetime.time,非 time 模块)表示时间部分,最小值为 time(0, 0, 0, 0),最大值为 time(23, 59, 59, 999999),分辨率为 1 微秒。属性包括 t.hour, t.minute, t.second, t.microsecond 以及 t.tzinfo。

t = time(hour=20, minute=20, second=40)
print(t)

datetime 对象

datetime 类结合了 date 和 time。常用方法包括:

  • datetime.now():获取当前日期与时间。
  • datetime.timestamp():获取时间戳。

示例:

from datetime import datetime
dt = datetime.now()
print(dt)

# 使用 datetime 的内置函数 timestamp()
stamp = datetime.timestamp(dt)
print(stamp)

timedelta 对象

timedelta 用于表示时间间隔。它没有必填参数,整数参数表示间隔天数,也可指定周、天、秒等。两个 timedelta 对象可相加或相减,datetime 减去 timedelta 返回新的 datetime,两个 datetime 对象相减返回 timedelta。

# 间隔 10 天
timedelta(10)
# 跨度为1 周
timedelta(weeks=1)

calendar 模块

calendar 模块包含与日历相关的函数,例如打印某月的字符月历。该模块定义了 Calendar 类,封装了值的计算,可计算给定月份或年份中周的日期。常用的子类包括:

  • TextCalendar:生成预格式化文本输出。
  • HTMLCalendar:生成预格式化 HTML 输出。

默认情况下,该模块从周日开始计算。示例:

import calendar

c = calendar.TextCalendar(calendar.SUNDAY)
c.prmonth(2021, 3)

总结

本文详细介绍了 Python 中处理时间与日期的三大核心模块:time、datetime 和 calendar。通过掌握这些模块的常用函数与对象,开发者可以灵活处理各种时间相关任务。建议读者结合具体业务场景,深入探索各模块的高级功能。

以上就是 Python 时间和日期库实现的详细内容,更多关于 Python 时间处理、datetime 模块用法、time 模块详解的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表