Python 获取昨天日期(超详细)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
在编程和数据处理中,日期操作是一项高频任务。无论是数据分析、日志记录,还是自动化脚本开发,获取“昨天日期”都是一个基础但关键的技能。对于 Python 开发者而言,掌握这一操作不仅能提升代码效率,还能为更复杂的日期逻辑打下坚实基础。本文将通过循序渐进的方式,从基础到进阶,详细讲解如何在 Python 中获取昨天日期,并提供多个实际应用场景的代码示例。
一、理解 Python 中的日期与时间模块
在 Python 中,日期和时间操作主要依赖两个核心模块:datetime
和 time
。其中,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 方法一:使用 datetime
和 timedelta
这是最直接且推荐的方法。步骤如下:
- 获取当前日期(
date.today()
或datetime.now().date()
); - 使用
timedelta(days=1)
减去 1 天; - 返回结果。
代码示例:
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 中获取昨天日期的多种方法,从基础的 datetime
和 timedelta
到进阶的时区处理和格式化技巧。掌握这些技能不仅能解决日常开发中的常见问题,还能为处理更复杂的日期逻辑(如计算年龄、生成周期报表)奠定基础。
关键步骤回顾:
- 使用
date.today()
或datetime.now()
获取当前日期; - 通过
timedelta(days=1)
计算时间差; - 根据需求格式化输出结果。
希望这些内容能帮助你更高效地编写 Python 代码,并在实际项目中灵活运用日期操作!