在编写代码时,我们时常会碰到需要处理时间的情况,例如系统记录用户的操作、计算某段程序的处理时长、某个功能只在特定的时间段触发等。Python内置提供了如time、calendar、datetime等用于时间处理的模块,无需手动安装。本章我们就讲一讲常用的time和datetime模块。
一、time模块
绝大多数编程语言通常是以一个浮点数或整数来记录时间(单位是秒甚至纳秒),并不是一个我们直观看到的日期字符串,这个数字就是时间戳。每个时间戳都以自1970年1月1日午夜(历元)经过了多长时间来表示。例如:
import timeprint(time.time())# Output: 1753154674.3639271
时间戳单位最适于做日期运算。但是1970年之前的日期就无法以此表示;太遥远的日期也有此问题,UNIX和Windows只支持到2038年。
(1)时间元组
很多Python函数用一个元组装起来的9组数字处理时间,例如time模块将时间戳转换为struct_time元组:
print(time.localtime(time.time()))# Output: time.struct_time(tm_year=2025, tm_mon=7, tm_mday=22, tm_hour=11, tm_min=27, tm_sec=54, tm_wday=1, tm_yday=203, tm_isdst=0)
元组中的属性对应关系如下:
属性 | 字段 | 属性 | 字段 |
tm_year | 年(四位数) | tm_sec | 秒 |
tm_mon | 月 | tm_wday | 一周第几日 |
tm_day | 日 | tm_yday | 一年第几日 |
tm_hour | 小时 | tm_isdst | 是否夏令时 |
tm_min | 分钟 |
(2)格式化时间
我们通常使用的时间表示是比较直观的,time模块也提供了将时间戳转换为更直观形式的格式化函数。例如:
print(time.asctime(time.localtime(time.time())))# Output: Tue Jul 22 11:33:58 2025
也可以根据自定义的格式将时间元组转换为格式化时间字符串:
print(time.strftime("%Y-%m-%d%H:%M:%S", time.localtime()))# Output: 2025-07-22 11:35:43
函数strftime第一个函数为格式化字符串,用于指定输出格式:%Y为四位数年份,%y为两位数年份,%m为月,%d为日,%H为24小时制小时,%I为12小时制小时,%M为分钟,%S为秒等。
同样,我们还可以将格式化的时间字符串解析为时间元组:
print(time.strptime("2025-07-22 11:35:43", "%Y-%m-%d%H:%M:%S"))# Output: time.struct_time(tm_year=2025, tm_mon=7, tm_mday=22, tm_hour=11, tm_min=35, tm_sec=43, tm_wday=1, tm_yday=203, tm_isdst=-1)
time模块还提供了很多功能,例如函数time.sleep(secs)可以将程序挂起暂停执行若干秒,属性time.timezone可以表示当前时区与UTC(协调世界时)之间的偏移量(单位:秒)。
二、datetime模块
datetime模块是Python标准库中用于处理日期和时间的工具。它提供了相比time模块更多的类和方法。
(1)主要类
datetime模块包含以下主要类:
datetime.date:表示日期(年、月、日)。
datetime.time:表示时间(时、分、秒、微秒)。
datetime.datetime:表示日期和时间的组合。
datetime.timedelta:表示两个日期或时间之间的差异。
datetime.timezone:表示时区。
(2)创建日期和时间对象
from datetime import date, time, datetime# 创建日期对象today = date.today() # 当前日期specific_date = date(2024, 10, 1) # 指定日期# 创建时间对象noon = time(12, 0, 0) # 指定时间# 创建日期时间对象now = datetime.now() # 当前日期和时间specific_datetime = datetime(2024, 10, 1, 12, 0, 0) # 指定日期和时间print(f"Today's date: {today}")print(f"Specific date: {specific_date}")print(f"Noon time: {noon}")print(f"Current datetime: {now}")print(f"Specific datetime: {specific_datetime}")# Output:# Today's date: 2025-07-22# Specific date: 2024-10-01# Noon time: 12:00:00# Current datetime: 2025-07-22 15:05:11.023183# Specific datetime: 2024-10-01 12:00:00
(3)格式化及解析日期和时间
同time模块,datetime模块同样提供了strftime和strptime用于格式化或解析时间字符串:
date_str = "2024-10-01"datetime_str = "2024-10-01 12:00:00"# 解析字符串为日期和时间对象parsed_date = datetime.strptime(date_str, "%Y-%m-%d")parsed_datetime = datetime.strptime(datetime_str, "%Y-%m-%d%H:%M:%S")print(f"Parsed date: {parsed_date.date()}")print(f"Parsed datetime: {parsed_datetime}")# Output:# Parsed date: 2024-10-01# Parsed datetime: 2024-10-01 12:00:00
解析时的格式化字符串使用方法同time模块。
(4)时间差计算
相比time模块,datetime强大的其中一点在于其对时间差计算的良好支持,其timedelta类能够便捷地完成时间偏移量的加减运算:
from datetime import datetime, timedelta# 当前日期和时间now = datetime.now()# 计算未来日期future_date = now + timedelta(days=10) # 10天后past_date = now - timedelta(days=5) # 5天前print(f"Current datetime: {now}")print(f"Future datetime (10 days later): {future_date}")print(f"Past datetime (5 days ago): {past_date}")# Output:# Current datetime: 2025-07-22 15:10:10.071172# Future datetime (10 days later): 2025-08-01 15:10:10.071172# Past datetime (5 days ago): 2025-07-17 15:10:10.071172
也能方便地计算两个时间的差:
now = datetime.now()past = datetime(2025, 6, 15, 12, 1, 30)print(f"Current time: {now}")print(f"Time delta: {now - past}")# Output:# Current time: 2025-07-22 15:13:39.936804# Time delta: 37 days, 3:12:09.936804
往期回顾: