跳转至

03 - 日期时间处理

学习时间: 1小时 重要性: ⭐⭐⭐⭐⭐ 时间处理无处不在


🎯 学习目标

  • 掌握datetime的基本用法
  • 学会时间格式化和解析
  • 处理时间差和时区

🕐 datetime 基础

获取当前时间

Python
from datetime import datetime, date, time

# 当前日期和时间
now = datetime.now()
print(now)  # 2026-01-25 14:30:00.123456

# 只要日期
today = date.today()
print(today)  # 2026-01-25

# 只要时间
current_time = datetime.now().time()
print(current_time)  # 14:30:00.123456

# UTC时间
from datetime import timezone
utc_now = datetime.now(timezone.utc)
print(utc_now)  # 2026-01-25 14:30:00+00:00

创建特定日期时间

Python
# 创建日期
d = date(2026, 1, 25)
print(d)  # 2026-01-25

# 创建时间
t = time(14, 30, 0)
print(t)  # 14:30:00

# 创建日期时间
dt = datetime(2026, 1, 25, 14, 30, 0)
print(dt)  # 2026-01-25 14:30:00

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

时间格式化

Python
now = datetime.now()

# 格式化为字符串
formatted = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted)  # 2026-01-25 14:30:00

# 常用格式
print(now.strftime("%Y-%m-%d"))      # 2026-01-25
print(now.strftime("%H:%M:%S"))      # 14:30:00
print(now.strftime("%A, %B %d, %Y")) # Sunday, January 25, 2026
print(now.strftime("%Y%m%d_%H%M%S")) # 20260125_143000

# 从字符串解析
dt = datetime.strptime("2026-01-25", "%Y-%m-%d")

⏱️ 时间计算

timedelta - 时间差

Python
from datetime import timedelta

# 创建时间差
delta = timedelta(days=7, hours=2, minutes=30)
print(delta)  # 7 days, 2:30:00

# 时间加减
now = datetime.now()
next_week = now + timedelta(days=7)
yesterday = now - timedelta(days=1)
future = now + timedelta(hours=3)

# 计算时间差
date1 = datetime(2026, 1, 25)
date2 = datetime(2026, 2, 1)
diff = date2 - date1
print(diff.days)  # 7

# 判断时间先后
if date2 > date1:
    print("date2 更晚")

实用示例

Python
# 1. 判断日期是否在范围内
from datetime import date, timedelta

def is_date_in_range(target, start, end):
    """检查target日期是否在[start, end]范围内"""
    return start <= target <= end

today = date.today()
start = date(2026, 1, 1)
end = date(2026, 12, 31)

if is_date_in_range(today, start, end):
    print("在范围内")

# 2. 获取上个月的第一天和最后一天
def get_last_month_range():
    today = date.today()
    first_day = today.replace(day=1)
    last_month = first_day - timedelta(days=1)
    first_day_of_last_month = last_month.replace(day=1)
    return first_day_of_last_month, last_month

# 3. 计算下一个星期五
def next_friday():
    today = date.today()
    days_until_friday = (4 - today.weekday()) % 7
    if days_until_friday == 0:
        days_until_friday = 7
    return today + timedelta(days=days_until_friday)

🌍 时区处理

Python
from datetime import datetime, timezone, timedelta

# 创建时区
beijing_tz = timezone(timedelta(hours=8))
tokyo_tz = timezone(timedelta(hours=9))

# 带时区的时间
now_beijing = datetime.now(beijing_tz)
print(now_beijing)  # 2026-01-25 14:30:00+08:00

# 时区转换
now_tokyo = now_beijing.astimezone(tokyo_tz)
print(now_tokyo)  # 2026-01-25 15:30:00+09:00

# ⚠️ 建议:使用第三方库处理复杂时区
# pip install pytz
# import pytz
# beijing = pytz.timezone('Asia/Shanghai')

💡 实用场景

场景1: 日志时间戳

Python
import logging
from datetime import datetime

def setup_logger():
    """配置日志格式,包含时间戳"""
    logging.basicConfig(
        level=logging.INFO,
        format='%(asctime)s - %(levelname)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )

logging.info("这是一条日志")
# 2026-01-25 14:30:00 - INFO - 这是一条日志

场景2: 数据时间筛选

Python
from datetime import datetime, timedelta

def filter_data_by_date(data, days=7):
    """筛选最近N天的数据"""
    cutoff = datetime.now() - timedelta(days=days)

    filtered = [
        item for item in data
        if datetime.fromisoformat(item['timestamp']) > cutoff
    ]

    return filtered

# 使用
data = [
    {"timestamp": "2026-01-20T10:00:00", "value": 10},
    {"timestamp": "2026-01-24T10:00:00", "value": 20},
    {"timestamp": "2026-01-25T10:00:00", "value": 30}
]

recent = filter_data_by_date(data, days=7)

场景3: 定时任务

Python
import time
from datetime import datetime

def run_daily_at(hour, minute, task):
    """每天在指定时间执行任务"""
    while True:
        now = datetime.now()
        target = now.replace(hour=hour, minute=minute, second=0, microsecond=0)

        if now >= target:
            target += timedelta(days=1)

        wait_seconds = (target - now).total_seconds()
        print(f"等待 {wait_seconds:.0f} 秒后执行...")
        time.sleep(wait_seconds)

        task()

# 使用
def my_task():
    print("执行任务!", datetime.now())

# run_daily_at(9, 0, my_task)  # 每天早上9点执行

📝 练习

  1. 计算两个日期之间的工作日数量(排除周末)
  2. 实现一个简单的倒计时器
  3. 将时间戳转换为可读格式

🎯 自我检查

  • 能创建和格式化datetime对象
  • 能进行时间计算(加减、差值)
  • 能解析和格式化时间字符串
  • 理解时区的基本概念
  • 能实现定时任务功能
  • 能在实际项目中正确处理时间

📚 延伸阅读


下一步: 04 - 命令行工具