Python 提供了强大的日期和时间处理功能,主要通过 datetime
模块实现。以下是全面的日期和时间处理指南。
目录
1. 核心模块
import datetime # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module # 时间相关函数
import calendar # 日历相关
各模块核心功能对比
模块/类 | 主要用途 | 示例 |
---|---|---|
datetime.date | 处理日期(年、月、日) | date(2023, 8, 20) |
datetime.time | 处理时间(时、分、秒、微秒) | time(15, 30, 45) |
datetime.datetime | 处理日期和时间 | datetime.now() |
datetime.timedelta | 处理时间间隔 | timedelta(days=1) |
time_module | 系统时间相关功能 | time_module.sleep(1) |
calendar | 日历相关操作 | calendar.month(2023, 8) |
1.1 date 类
from datetime import date
# 创建日期对象
today = date.today() # 当前日期
specific_date = date(2023, 5, 15) # 指定日期
print(today) # 输出: 2023-05-15 (示例)
print(specific_date.year) # 2023
print(specific_date.month) # 5
print(specific_date.day) # 15
# 日期运算
delta = today - specific_date # 时间差
print(delta.days) # 相差天数
1.2 time 类
from datetime import time
# 创建时间对象
t = time(14, 30, 15) # 14:30:15
print(t.hour) # 14
print(t.minute) # 30
print(t.second) # 15
print(t.microsecond) # 0 (默认)
1.3 datetime 类
from datetime import datetime
# 当前日期和时间
now = datetime.now()
print(now) # 2023-05-15 14:32:45.123456 (示例)
# 指定日期和时间
dt = datetime(2023, 5, 15, 14, 30, 0)
print(dt) # 2023-05-15 14:30:00
# 获取date和time部分
print(dt.date()) # 2023-05-15
print(dt.time()) # 14:30:00
# 时间戳转换
timestamp = dt.timestamp() # 转换为时间戳
print(datetime.fromtimestamp(timestamp)) # 从时间戳转换回来
1.4 timedelta 类
from datetime import datetime, timedelta
now = datetime.now()
# 加减时间
tomorrow = now + timedelta(days=1)
last_week = now - timedelta(weeks=1)
# 复杂的时间差
delta = timedelta(
days=5,
hours=3,
minutes=30,
seconds=15
)
future = now + delta
print(future)
2. 获取当前时间
2.1 获取当前日期和时间
import datetime # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module # 时间相关函数
import calendar # 日历相关
now = datetime.now() # 返回datetime对象
print(now) # 例如: 2025-08-20 15:30:45.123456
today = date.today() # 只获取日期
print(today) # 例如: 2025-08-20
2.2 获取时间戳
import datetime # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module # 时间相关函数
import calendar # 日历相关
timestamp = time_module.time() # 当前时间戳(秒)
print(timestamp) # 例如: 1692531045.123456
# 时间戳转datetime
dt = datetime.fromtimestamp(timestamp)
print(dt) # 2023-08-20 15:30:45.123456
3. 创建特定日期/时间
import datetime # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module # 时间相关函数
import calendar # 日历相关
# 创建日期
d = date(2023, 8, 20)
print(d) # 2023-08-20
# 创建时间
t = time(15, 30, 45)
print(t) # 15:30:45
# 创建datetime
dt = datetime(2023, 8, 20, 15, 30, 45)
print(dt) # 2023-08-20 15:30:45
4. 时间格式转换
4.1 常用格式代码
代码 | 含义 | 示例 |
---|---|---|
%Y | 四位数的年份 | 2023 |
%m | 两位数的月份(01-12) | 05 |
%d | 两位数的日(01-31) | 15 |
%H | 24小时制的小时(00-23) | 14 |
%I | 12小时制的小时(01-12) | 02 |
%M | 分钟(00-59) | 30 |
%S | 秒(00-59) | 45 |
%A | 完整的星期名称 | Monday |
%B | 完整的月份名称 | May |
%p | AM/PM | PM |
4.2 datetime转字符串
import datetime # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module # 时间相关函数
import calendar # 日历相关
now = datetime.now()
formatted = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted) # "2023-08-20 15:30:45"
# 常用格式
print(now.strftime("%A, %B %d, %Y")) # "Sunday, August 20, 2023"
print(now.strftime("%I:%M %p")) # "03:30 PM"
4.3 字符串转datetime
import datetime # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module # 时间相关函数
import calendar # 日历相关
date_str = "2023-08-20 15:30:45"
dt = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print(dt) # 2023-08-20 15:30:45
5. 时间计算
5.1 使用timedelta
import datetime # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module # 时间相关函数
import calendar # 日历相关
# 基本加减
now = datetime.now()
tomorrow = now + timedelta(days=1)
last_week = now - timedelta(weeks=1)
# 复杂计算
future = now + timedelta(
days=5,
hours=3,
minutes=30,
seconds=15
)
print(future)
5.2 日期差计算
import datetime # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module # 时间相关函数
import calendar # 日历相关
date1 = date(2023, 8, 1)
date2 = date(2023, 8, 20)
delta = date2 - date1
print(delta.days) # 19
6. 时间组件访问
import datetime # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module # 时间相关函数
import calendar # 日历相关
dt = datetime.now()
print(dt.year) # 2023
print(dt.month) # 8
print(dt.day) # 20
print(dt.hour) # 15
print(dt.minute) # 30
print(dt.second) # 45
print(dt.microsecond) # 123456
print(dt.weekday()) # 0-6 (0是周一)
print(dt.isoweekday()) # 1-7 (1是周一)
7. 时区处理
7.1 基本时区操作
import datetime # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module # 时间相关函数
import calendar # 日历相关
from datetime import timezone
# UTC时间
utc_now = datetime.now(timezone.utc)
print(utc_now) # 2023-08-20 07:30:45.123456+00:00
# 自定义时区
beijing_tz = timezone(timedelta(hours=8))
beijing_time = datetime.now(beijing_tz)
print(beijing_time) # 2023-08-20 15:30:45.123456+08:00
7.2 时区转换
import datetime # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module # 时间相关函数
import calendar # 日历相关
from datetime import timezone
# UTC时间
utc_now = datetime.now(timezone.utc)
print(utc_now) # 2023-08-20 07:30:45.123456+00:00
# 从UTC转换到其他时区
ny_tz = timezone(timedelta(hours=-5))
ny_time = utc_now.astimezone(ny_tz)
print(ny_time) # 2023-08-20 02:30:45.123456-05:00
8. 实用函数
8.1 月份天数
import datetime # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module # 时间相关函数
import calendar # 日历相关
# 获取某个月的天数
print(calendar.monthrange(2025, 8)[1]) # 31
# 或者使用date
def days_in_month(year, month):
if month == 12:
return (date(year+1, 1, 1) - date(year, 12, 1)).days
else:
return (date(year, month+1, 1) - date(year, month, 1)).days
print(days_in_month(2025, 8)) # 31
8.2 闰年判断
import datetime # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module # 时间相关函数
import calendar # 日历相关
def is_leap(year):
return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
print(is_leap(2025)) # False
9. 性能计时
import datetime # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module # 时间相关函数
import calendar # 日历相关
# 简单计时
start = time_module.perf_counter()
# 执行代码...
end = time_module.perf_counter()
print(f"耗时: {end - start:.4f}秒")
# 更精确的计时
start = time_module.perf_counter_ns()
# 执行代码...
end = time_module.perf_counter_ns()
print(f"耗时: {(end - start)/1e6:.4f}毫秒")
10. 其他有用功能
10.1 获取周的开始和结束
import datetime # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module # 时间相关函数
import calendar # 日历相关
def week_range(date):
start = date - timedelta(days=date.weekday())
end = start + timedelta(days=6)
return start, end
start, end = week_range(date.today())
print(f"本周从 {start} 到 {end}")
10.2 日期迭代器
import datetime # 主模块
from datetime import date, time, datetime, timedelta
import time as time_module # 时间相关函数
import calendar # 日历相关
def date_range(start_date, end_date):
for n in range(int((end_date - start_date).days) + 1):
yield start_date + timedelta(n)
for single_date in date_range(date(2025, 8, 1), date(2025, 8, 10)):
print(single_date.strftime("%Y-%m-%d"))
总结
Python 的日期时间处理功能非常全面,可以满足各种需求:
-
基本日期时间创建和访问
-
灵活的时间格式转换
-
精确的时间计算
-
时区处理
-
高性能计时
最佳实践建议
-
时区处理原则:
-
所有时间在存储和传输时使用UTC
-
只在显示给用户时转换为本地时区
-
-
性能敏感场景:
-
使用
time_module.perf_counter()
而不是time.time()
-
对于大量日期计算,考虑使用第三方库
pendulum
-
-
代码可读性:
-
为业务相关的日期操作创建工具函数
-
使用具名常量代替魔术数字(如
SECONDS_PER_DAY = 86400
)
-
-
错误处理:
-
总是验证用户输入的日期
-
处理闰年和非法日期(如2月30日)
-
对于更复杂的时区处理,建议使用 Python 3.9+ 的 zoneinfo
模块或第三方库 pytz
。