使用Python的datetime模块轻松处理日期和时间!
要在电脑上通过命令提示符或 PowerShell 运行 Python,需要先下载并安装 Python。
如果你还没有安装,请参考Python安装与开发环境配置一文来完成安装。
在开发网站或应用程序时,我们经常会遇到需要处理日期和时间的场景,比如“显示当前时间”、“记录文章的发布日期和时间”、“计算促销活动结束的剩余时间”等。在这种时候,Python内置的datetime模块就能大显身手。
本文将通过简单易懂的示例代码,从datetime模块的基础用法到一些应用技巧进行解说,即使是初学者也能通过复制粘贴来体验“代码跑起来”的感觉。那么,就让我们一起进入日期和时间的世界吧!🚀
datetime模块的基础知识
首先,我们从使用datetime模块的准备工作以及最基本的功能——“获取当前日期和时间”开始吧。
导入模块
要使用datetime模块,首先需要在代码的开头将其导入(加载)。如果没有这一步,Python就会不明白“datetime是什么?”。
import datetime
获取当前日期和时间
获取此时此刻的日期和时间非常简单,只需调用 `datetime.datetime.now()` 即可。
import datetime
# 获取当前日期和时间
now = datetime.datetime.now()
print(now)
# 示例输出: 2025-07-11 07:42:15.123456
如果不需要时间,只想获取今天的日期,可以使用 `datetime.date.today()`。
import datetime
# 只获取今天的日期
today = datetime.date.today()
print(today)
# 示例输出: 2025-07-11
访问日期和时间的各个元素
从获取的 `datetime` 对象中,可以提取出年、月、日、时、分、秒等独立信息。这在希望显示“今年是2025年”等信息时非常方便。
import datetime
now = datetime.datetime.now()
print(f"年: {now.year}")
print(f"月: {now.month}")
print(f"日: {now.day}")
print(f"时: {now.hour}")
print(f"分: {now.minute}")
print(f"秒: {now.second}")
print(f"微秒: {now.microsecond}")
自己创建指定的日期和时间
当然,不仅可以获取当前时间,也可以创建表示过去或未来特定日期的对象。这在指定生日或服务启动日期等情况下会用到。
import datetime
# 指定2026年1月1日 上午9点30分0秒
specific_datetime = datetime.datetime(2026, 1, 1, 9, 30, 0)
print(specific_datetime)
# 输出: 2026-01-01 09:30:00
格式化日期和时间使其更易读
像 `2025-07-11 07:42:15` 这样的格式也不错,但在网站上,我们可能希望显示得更直观一些,比如“2025年07月11日 07时42分”。这时候,`strftime()` 方法就派上用场了。
使用strftime()转换为喜欢的格式字符串
`strftime()` 是 "string format time" 的缩写,它能将 `datetime` 对象转换为指定格式的字符串。为了指定格式,我们会使用像 `%Y`、`%m` 这样的“格式化代码”。
import datetime
now = datetime.datetime.now()
# 指定格式并转换为字符串
formatted_string = now.strftime("%Y年%m月%d日 %H时%M分%S秒")
print(formatted_string)
# 示例输出: 2025年07月11日 07时42分15秒
下面介绍一些常用的格式化代码。
- `%Y`: 4位数的年份 (例: 2025)
- `%y`: 2位数的年份 (例: 25)
- `%m`: 2位数的月份 (01-12)
- `%d`: 2位数的日期 (01-31)
- `%H`: 24小时制的小时 (00-23)
- `%I`: 12小时制的小时 (01-12)
- `%p`: 上午/下午 (AM/PM)
- `%M`: 2位数的分钟 (00-59)
- `%S`: 2位数的秒 (00-59)
- `%A`: 星期几的全称 (例: Friday)
- `%a`: 星期几的简称 (例: Fri)
使用strptime()将字符串转换为日期时间
反过来,有时我们也希望将“2025/07/11”这样的字符串数据转换为程序可以处理的 `datetime` 对象。这时就可以使用 `strptime()` 方法了。它是 "string parse time" 的缩写,可以解析字符串。
重要: 使用 `strptime()` 时,原始字符串的格式必须与指定的格式化代码完全匹配。如果不匹配,将会导致错误,需要特别注意。
import datetime
date_string = "2025年7月11日"
# 指定字符串的格式,将其转换为datetime对象
# 在此例中,由于只有日期,所以会变成date对象
date_obj = datetime.datetime.strptime(date_string, "%Y年%m月%d日").date()
print(date_obj)
print(type(date_obj))
# 输出:
# 2025-07-11
# <class 'datetime.date'>
应用篇:来计算日期和时间吧
datetime模块的真正魅力在于能轻松进行日期和时间的计算。我们可以使用 `timedelta` 对象直观地进行“一周后的日期是?”、“距离促销结束还有几天?”等计算。
使用timedelta表示时间差
`timedelta` 是一个用于表示两个日期时间之间的时间段(时间差)的对象。通过指定天数、秒数、微秒数等来创建。
import datetime
now = datetime.datetime.now()
print(f"当前时间: {now.strftime('%Y-%m-%d %H:%M')}")
# 计算一周后的时间
one_week_later = now + datetime.timedelta(weeks=1)
print(f"一周后: {one_week_later.strftime('%Y-%m-%d %H:%M')}")
# 计算三天前的时间
three_days_ago = now - datetime.timedelta(days=3)
print(f"三天前: {three_days_ago.strftime('%Y-%m-%d %H:%M')}")
# 计算10小时30分钟后的时间
ten_hours_later = now + datetime.timedelta(hours=10, minutes=30)
print(f"10小时30分钟后: {ten_hours_later.strftime('%Y-%m-%d %H:%M')}")
计算两个日期之差
两个 `datetime` 对象相减,结果会是一个 `timedelta` 对象。利用这一点,可以计算到特定日期还剩多少天等。
import datetime
# 今天的日期
today = datetime.date.today()
# 目标日期(例如,2026年的元旦)
new_year_2026 = datetime.date(2026, 1, 1)
# 计算两个日期之差
delta = new_year_2026 - today
print(f"距离2026年元旦还有 {delta.days} 天。")
注意事项:时区的陷阱
到目前为止,我们例子中处理的日期时间其实都是不带时区信息的“**朴素**(naive)”对象。对于个人使用的简单脚本来说可能没问题,但如果要开发一个供全球用户访问的Web服务,时区就是一个无法回避的问题。
例如,日本的“7月11日上午9点”和美国的“7月11日上午9点”是完全不同的时刻。为了正确处理这种差异,我们需要使用带有TimeZone信息的“**感知**(aware)”对象。
在Python 3.9及以上版本中,可以使用标准库 `zoneinfo` 轻松处理时区问题。
import datetime
from zoneinfo import ZoneInfo
# 指定时区获取当前时间
tokyo_tz = ZoneInfo("Asia/Tokyo")
now_tokyo = datetime.datetime.now(tokyo_tz)
print(f"东京当前时间: {now_tokyo}")
newyork_tz = ZoneInfo("America/New_York")
now_newyork = datetime.datetime.now(newyork_tz)
print(f"纽约当前时间: {now_newyork}")
# 可以看到附加了时区信息
# 示例输出:
# 东京当前时间: 2025-07-11 08:01:07.123456+09:00
# 纽约当前时间: 2025-07-10 19:01:07.123456-04:00
在开发国际化服务时,请务必在实现中考虑到时区!
【实践】可直接复制运行!在网页上显示当前时间
最后,我们将利用目前所学的知识,提供一个完整的HTML示例,可以在网页上实时显示日本标准时间(JST)。您可以将此代码另存为HTML文件,直接用浏览器打开即可运行。
※此示例为了实时更新时间,在HTML中包含了JavaScript。
请将以下代码保存为 `clock.html` 之类的文件名,然后用浏览器打开看看。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>实时时间显示</title>
<style>
body {
background-color: #202124;
color: #e8eaed;
font-family: sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
flex-direction: column;
}
h1 {
color: #669df6;
}
#clock {
font-size: 3rem;
font-weight: bold;
background-color: #3c4043;
padding: 20px 40px;
border-radius: 10px;
}
</style>
</head>
<body>
<h1>当前日本时间</h1>
<div id="clock">--:--:--</div>
<script>
function updateClock() {
// 以日本标准时间 (JST, UTC+9) 生成时间
const now = new Date();
const jstOffset = 9 * 60; // JST是UTC+9小时
const localOffset = -now.getTimezoneOffset(); // 本地时区偏移量(分钟)
const jstNow = new Date(now.getTime() + (jstOffset - localOffset) * 60 * 1000);
const hours = String(jstNow.getHours()).padStart(2, '0');
const minutes = String(jstNow.getMinutes()).padStart(2, '0');
const seconds = String(jstNow.getSeconds()).padStart(2, '0');
document.getElementById('clock').textContent = `${hours}:${minutes}:${seconds}`;
}
// 每秒更新一次时钟
setInterval(updateClock, 1000);
// 页面加载时首次执行
updateClock();
</script>
</body>
</html>
总结
这次,我们学习了如何使用Python的 `datetime` 模块来处理日期和时间。
- 获取当前时间: `datetime.now()` 和 `date.today()`
- 格式转换: 使用 `strftime()` 转换为字符串,使用 `strptime()` 从字符串转换
- 日期时间计算: 使用 `timedelta` 自由地进行加减运算
- 时区: 在国际化应用中,使用 `zoneinfo` 处理“感知”对象非常重要
如果能熟练使用 `datetime` 模块,您能创造的东西的范围就会大大拓宽,比如日志的时间戳、用户注册日期的记录、活动倒计时等。请务必多试试本文中的代码,创造出属于您自己的程序吧!