当前位置:首页>python>Python datetime模块——日期与时间的处理

Python datetime模块——日期与时间的处理

  • 2026-10-11 08:27:54
Python datetime模块——日期与时间的处理

一、datetime模块概述

datetime 是 Python 标准库中用于处理日期和时间的模块。它提供了多种类和函数,可以创建、操作、格式化日期和时间数据。在实际开发中,无论是记录日志、计算时间差、处理用户生日,还是分析时间序列数据,都离不开这个模块。

from datetime import datetime

# 获取当前日期和时间
now = datetime.now()
print(now)                     # 2025-01-15 14:30:25.123456
print(type(now))               # <class 'datetime.datetime'>

二、datetime模块的核心类

类名
描述
包含信息
date
日期
年、月、日
time
时间
时、分、秒、微秒
datetime
日期和时间
年、月、日、时、分、秒、微秒
timedelta
时间间隔
天、秒、微秒
tzinfo
时区信息(抽象基类)
时区相关

三、date类——处理日期

3.1 创建date对象

from datetime import date

# 创建指定日期
d1 = date(2025, 1, 15)
print(d1)           # 2025-01-15

# 获取当前日期
today = date.today()
print(today)        # 当前系统日期

3.2 获取日期属性

d = date(2025, 1, 15)
print(d.year)       # 2025
print(d.month)      # 1
print(d.day)        # 15

# 获取星期几(0=周一,6=周日)
print(d.weekday())      # 2(周三)
print(d.isoweekday())   # 3(周三,1=周一,7=周日)

3.3 日期运算

from datetime import date, timedelta

d = date(2025, 1, 15)

# 日期加减
d_next = d + timedelta(days=7)
print(d_next)       # 2025-01-22

d_prev = d - timedelta(days=3)
print(d_prev)       # 2025-01-12

# 计算日期差
d1 = date(2025, 1, 1)
d2 = date(2025, 1, 15)
diff = d2 - d1
print(diff.days)    # 14

3.4 日期比较

d1 = date(2025, 1, 1)
d2 = date(2025, 1, 15)

print(d1 < d2)      # True
print(d1 == d2)     # False

四、time类——处理时间

4.1 创建time对象

from datetime import time

# 创建指定时间
t = time(14, 30, 25)   # 14:30:25
print(t)                # 14:30:25

# 带微秒
t2 = time(14, 30, 25, 500000)
print(t2)               # 14:30:25.500000

4.2 获取时间属性

t = time(14, 30, 25, 500000)
print(t.hour)       # 14
print(t.minute)     # 30
print(t.second)     # 25
print(t.microsecond) # 500000

五、datetime类——处理日期和时间

5.1 创建datetime对象

from datetime import datetime

# 创建指定日期时间
dt = datetime(2025, 1, 15, 14, 30, 25)
print(dt)           # 2025-01-15 14:30:25

# 获取当前日期时间
now = datetime.now()
print(now)          # 2025-01-15 14:30:25.123456

# 获取当前UTC时间
utc_now = datetime.utcnow()
print(utc_now)

# 从时间戳创建
timestamp = 1705300225
dt_from_ts = datetime.fromtimestamp(timestamp)
print(dt_from_ts)

# 从字符串解析
dt_from_str = datetime.strptime("2025-01-15 14:30:25", "%Y-%m-%d %H:%M:%S")
print(dt_from_str)

5.2 获取datetime属性

dt = datetime(2025, 1, 15, 14, 30, 25)
print(dt.year)          # 2025
print(dt.month)         # 1
print(dt.day)           # 15
print(dt.hour)          # 14
print(dt.minute)        # 30
print(dt.second)        # 25
print(dt.weekday())     # 2(周三)

5.3 datetime运算

from datetime import datetime, timedelta

dt = datetime(2025, 1, 15, 14, 30, 25)

# 加减时间
dt_next = dt + timedelta(days=7, hours=2)
print(dt_next)      # 2025-01-22 16:30:25

dt_prev = dt - timedelta(days=3)
print(dt_prev)      # 2025-01-12 14:30:25

# 计算时间差
dt1 = datetime(2025, 1, 1, 0, 0, 0)
dt2 = datetime(2025, 1, 15, 14, 30, 25)
diff = dt2 - dt1
print(diff.days)            # 14
print(diff.seconds)         # 52225(14*3600 + 30*60 + 25)
print(diff.total_seconds()) # 1252225.0

六、timedelta类——时间间隔

6.1 创建timedelta

from datetime import timedelta

# 各种创建方式
td1 = timedelta(days=5)
td2 = timedelta(hours=10)
td3 = timedelta(minutes=30)
td4 = timedelta(seconds=45)
td5 = timedelta(weeks=2)      # 14天
td6 = timedelta(days=1, hours=2, minutes=30)

print(td1)      # 5 days, 0:00:00
print(td5)      # 14 days, 0:00:00

6.2 timedelta属性

td = timedelta(days=5, hours=10, minutes=30, seconds=15)
print(td.days)          # 5
print(td.seconds)       # 37815(10*3600 + 30*60 + 15)
print(td.total_seconds())   # 469815.0

七、格式化与解析

7.1 strftime——将datetime转为字符串

from datetime import datetime

now = datetime.now()

# 常用格式
print(now.strftime("%Y-%m-%d"))                    # 2025-01-15
print(now.strftime("%Y年%m月%d日"))                 # 2025年01月15日
print(now.strftime("%H:%M:%S"))                    # 14:30:25
print(now.strftime("%Y-%m-%d %H:%M:%S"))           # 2025-01-15 14:30:25
print(now.strftime("%A"))                          # Wednesday
print(now.strftime("%B"))                          # January

常用格式化代码:

代码
含义
示例
%Y
4位年份
2025
%y
2位年份
25
%m
月份(01-12)
01
%d
日期(01-31)
15
%H
小时(00-23)
14
%I
小时(01-12)
02
%M
分钟(00-59)
30
%S
秒(00-59)
25
%f
微秒
123456
%p
AM/PM
PM
%A
完整星期几
Wednesday
%a
缩写星期几
Wed
%B
完整月份名
January
%b
缩写月份名
Jan
%j
年中的第几天
015
%w
星期几(0=周日)
3
%U
年中的第几周
02

7.2 strptime——将字符串解析为datetime

from datetime import datetime

# 解析常见格式
dt1 = datetime.strptime("2025-01-15", "%Y-%m-%d")
print(dt1)          # 2025-01-15 00:00:00

dt2 = datetime.strptime("2025-01-15 14:30:25", "%Y-%m-%d %H:%M:%S")
print(dt2)          # 2025-01-15 14:30:25

dt3 = datetime.strptime("15/Jan/2025:14:30:25", "%d/%b/%Y:%H:%M:%S")
print(dt3)          # 2025-01-15 14:30:25

7.3 isoformat和fromisoformat

from datetime import datetime

# ISO 8601格式
now = datetime.now()
iso_str = now.isoformat()
print(iso_str)      # 2025-01-15T14:30:25.123456

# 从ISO格式解析
dt = datetime.fromisoformat(iso_str)
print(dt)

八、实战案例

8.1 计算年龄

from datetime import date

defcalculate_age(birth_date):
    today = date.today()
    age = today.year - birth_date.year
# 检查是否还没过生日
if (today.month, today.day) < (birth_date.month, birth_date.day):
        age -= 1
return age

birth = date(1990, 5, 20)
print(f"年龄: {calculate_age(birth)} 岁")

8.2 获取某个月的天数

from datetime import date

defdays_in_month(year, month):
if month == 12:
        next_month = date(year + 1, 1, 1)
else:
        next_month = date(year, month + 1, 1)
    first_day = date(year, month, 1)
return (next_month - first_day).days

print(days_in_month(2024, 2))   # 29(闰年)
print(days_in_month(2025, 2))   # 28

8.3 生成日期范围

from datetime import date, timedelta

defdate_range(start_date, end_date):
"""生成从 start_date 到 end_date 的所有日期"""
    current = start_date
while current <= end_date:
yield current
        current += timedelta(days=1)

start = date(2025, 1, 1)
end = date(2025, 1, 10)
for d in date_range(start, end):
print(d)

8.4 计算两个日期之间的工作日

from datetime import date, timedelta

defworkdays_between(start_date, end_date):
"""计算两个日期之间的工作日数量(周一至周五)"""
    days = 0
    current = start_date
while current <= end_date:
if current.weekday() < 5:  # 0=周一, 4=周五
            days += 1
        current += timedelta(days=1)
return days

start = date(2025, 1, 1)
end = date(2025, 1, 31)
print(f"工作日: {workdays_between(start, end)} 天")

8.5 时间戳转换

from datetime import datetime

# datetime 转时间戳
dt = datetime(2025, 1, 15, 14, 30, 25)
timestamp = dt.timestamp()
print(timestamp)        # 1705300225.0

# 时间戳转 datetime
dt2 = datetime.fromtimestamp(timestamp)
print(dt2)              # 2025-01-15 14:30:25

8.6 定时任务(每隔N秒执行)

import time
from datetime import datetime

defschedule_task(interval_seconds, duration_seconds):
"""每隔 interval_seconds 秒执行一次,持续 duration_seconds 秒"""
    start_time = datetime.now()
    end_time = start_time + timedelta(seconds=duration_seconds)

while datetime.now() < end_time:
print(f"执行任务 at {datetime.now().strftime('%H:%M:%S')}")
        time.sleep(interval_seconds)

# 每隔2秒执行,持续10秒
# schedule_task(2, 10)

九、常见错误与注意事项

  1. 1. 月份和日期从1开始:datetime(2025, 1, 15) 中的月份和日期都是从1开始的,不是0。
  2. 2. strptime格式必须完全匹配:
    # 错误:格式不匹配
    # datetime.strptime("2025-01-15", "%Y/%m/%d")  # ValueError

    # 正确
    datetime.strptime("2025-01-15", "%Y-%m-%d")
  3. 3. timedelta不能用于月份和年份:timedelta 只支持天、秒、微秒,加减月份应使用 dateutil.relativedelta。
  4. 4. 时区问题:datetime.now() 返回本地时间,datetime.utcnow() 返回UTC时间。处理时区应考虑使用 pytz 或 zoneinfo(Python 3.9+)。
  5. 5. datetime是不可变对象:所有操作都会返回新的对象,不会修改原对象。
  6. 请在微信客户端打开


十、总结

类
主要用途
常用方法
date
处理日期
today()
, weekday(), strftime()
time
处理时间
hour
, minute, second
datetime
处理日期和时间
now()
, strptime(), strftime()
timedelta
时间间隔
days
, seconds, total_seconds()

核心要点:

  • • 使用 datetime.now() 获取当前时间。
  • • 使用 strftime() 将时间格式化为字符串。
  • • 使用 strptime() 将字符串解析为时间。
  • • 使用 timedelta 进行时间加减运算。
  • • 注意时区问题,跨时区场景使用 pytz 或 zoneinfo。

掌握 datetime 模块,是处理日期时间相关需求的基础,无论是简单的日志记录还是复杂的时间计算,都能轻松应对。

最新文章

随机文章