Python 获取昨天日期(超详细)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

在编程和数据处理中,日期操作是一项高频任务。无论是数据分析、日志记录,还是自动化脚本开发,获取“昨天日期”都是一个基础但关键的技能。对于 Python 开发者而言,掌握这一操作不仅能提升代码效率,还能为更复杂的日期逻辑打下坚实基础。本文将通过循序渐进的方式,从基础到进阶,详细讲解如何在 Python 中获取昨天日期,并提供多个实际应用场景的代码示例。


一、理解 Python 中的日期与时间模块

在 Python 中,日期和时间操作主要依赖两个核心模块:datetimetime。其中,datetime 是更现代且功能更强大的模块,而 time 则是 Python 的内置模块,功能相对基础。对于获取昨天日期的需求,推荐优先使用 datetime 模块,因为它提供了更直观和灵活的日期计算方式。

1.1 datetime 模块基础

datetime 模块的核心是 datetime 类,它能够同时表示日期和时间。例如:

from datetime import datetime  

current_time = datetime.now()  
print(current_time)  # 输出类似:2023-10-05 14:30:45.123456  

通过 datetime.now() 可以获取当前的日期和时间,但若仅需日期部分,可以使用 date 类:

from datetime import date  

current_date = date.today()  
print(current_date)  # 输出类似:2023-10-05  

1.2 时间差计算:timedelta 的作用

要获取“昨天的日期”,需要先知道如何计算时间差。Python 的 datetime 模块提供了 timedelta 类,用于表示两个日期或时间点之间的差异。例如:

from datetime import datetime, timedelta  

current_date = datetime.now().date()  

yesterday = current_date - timedelta(days=1)  
print(yesterday)  # 输出:2023-10-04(假设今天是 2023-10-05)  

这里,timedelta(days=1) 表示向前移动 1 天,从而得到昨天的日期。


二、实现“获取昨天日期”的核心方法

2.1 方法一:使用 datetimetimedelta

这是最直接且推荐的方法。步骤如下:

  1. 获取当前日期(date.today()datetime.now().date());
  2. 使用 timedelta(days=1) 减去 1 天;
  3. 返回结果。

代码示例:

from datetime import date, timedelta  

def get_yesterday():  
    today = date.today()  
    yesterday = today - timedelta(days=1)  
    return yesterday  

print(get_yesterday())  # 输出:YYYY-MM-DD 格式的日期  

解释:

  • date.today() 返回当前日期对象;
  • timedelta(days=1) 表示 1 天的时间差,减法运算自动将时间向前推 1 天。

2.2 方法二:通过 datetime 对象转换

若需要同时处理日期和时间(如需保留时间部分),可以使用 datetime 对象:

from datetime import datetime, timedelta  

def get_yesterday_datetime():  
    now = datetime.now()  
    yesterday = now - timedelta(days=1)  
    return yesterday  

print(get_yesterday_datetime())  # 输出:YYYY-MM-DD HH:MM:SS.ffffff  

注意:

  • 这种方法会保留当前的时间信息(如小时、分钟等),若仅需日期部分,可以通过 .date() 方法提取:
    yesterday_date = get_yesterday_datetime().date()  
    

2.3 方法三:使用 time 模块(基础但不推荐)

虽然 time 模块也能处理时间,但其功能较为基础,且返回的是时间戳(Unix 时间),需要额外转换:

import time  
from datetime import datetime  

def get_yesterday_time():  
    # 获取当前时间戳  
    current_time = time.time()  
    # 减去一天的秒数(24*60*60)  
    yesterday_timestamp = current_time - 86400  
    # 转换为日期对象  
    return datetime.fromtimestamp(yesterday_timestamp).date()  

print(get_yesterday_time())  # 输出:YYYY-MM-DD  

缺点:

  • 需要手动计算时间差(如 86400 秒 = 1 天),代码可读性较差;
  • 对时区处理不够灵活,可能因时区问题导致错误。

三、常见问题与进阶技巧

3.1 时区问题:如何处理不同时区的日期?

默认情况下,datetime.now() 返回的是本地时间。若需处理其他时区(如 UTC 时间),可以借助 pytz 库或 Python 3.2+ 的 zoneinfo 模块:

from datetime import datetime, timedelta  
import pytz  

utc = pytz.utc  
now_utc = datetime.now(utc)  
yesterday_utc = now_utc - timedelta(days=1)  
print(yesterday_utc)  # 输出 UTC 时间的昨天日期  

3.2 格式化输出:如何将日期转为字符串?

使用 strftime 方法可以将日期对象格式化为字符串:

yesterday = get_yesterday()  
formatted_date = yesterday.strftime("%Y-%m-%d")  # 输出 "YYYY-MM-DD"  
formatted_date_cn = yesterday.strftime("%Y年%m月%d日")  # 输出 "YYYY年MM月DD日"  

常用格式符:
| 格式符 | 说明 | 示例 |
|--------|--------------------|--------------|
| %Y | 四位数年份 | 2023 |
| %m | 两位数月份 | 10 |
| %d | 两位数日期 | 05 |
| %H | 24小时制小时 | 14 |
| %M | 分钟 | 30 |


3.3 高级用法:获取上周的同一天

若需获取“上周的今天”(即 7 天前的日期),只需调整 timedelta 的天数:

def get_previous_week():  
    today = date.today()  
    previous_week = today - timedelta(days=7)  
    return previous_week.strftime("%Y-%m-%d")  

print(get_previous_week())  

四、实际应用场景与案例

4.1 案例 1:生成文件名

在自动化脚本中,常需根据日期生成唯一文件名:

def generate_file_name():  
    yesterday = get_yesterday().strftime("%Y%m%d")  
    return f"report_{yesterday}.csv"  

print(generate_file_name())  # 输出:report_20231004.csv  

4.2 案例 2:数据库查询过滤

在 SQL 查询中,可以动态构造条件语句:

query = (  
    "SELECT * FROM sales "  
    f"WHERE sale_date >= '{yesterday}' "  
    f"AND sale_date < '{current_date}'"  
)  

4.3 案例 3:日志文件归档

根据日期自动归档旧日志文件:

import os  

def archive_logs():  
    yesterday_str = get_yesterday().strftime("%Y-%m-%d")  
    log_path = f"/var/logs/{yesterday_str}.log"  
    # 移动或压缩文件的逻辑  
    if os.path.exists(log_path):  
        os.rename(log_path, f"{log_path}.archived")  

五、性能与注意事项

5.1 性能比较

三种方法的性能差异较小,但推荐优先使用 datetime 模块,因其代码简洁且可读性高。

5.2 注意事项

  • 时区问题:确保代码运行环境的时区与需求一致,必要时显式指定时区;
  • 闰年与月份边界timedelta 天数计算会自动处理不同月份或闰年的情况,无需额外逻辑;
  • 避免字符串操作:直接使用日期对象进行计算,而非手动操作日期字符串(如 YYYY-MM-DD)。

六、总结

通过本文,我们系统地学习了 Python 中获取昨天日期的多种方法,从基础的 datetimetimedelta 到进阶的时区处理和格式化技巧。掌握这些技能不仅能解决日常开发中的常见问题,还能为处理更复杂的日期逻辑(如计算年龄、生成周期报表)奠定基础。

关键步骤回顾:

  1. 使用 date.today()datetime.now() 获取当前日期;
  2. 通过 timedelta(days=1) 计算时间差;
  3. 根据需求格式化输出结果。

希望这些内容能帮助你更高效地编写 Python 代码,并在实际项目中灵活运用日期操作!

最新发布