日期和时间

PythonBeginner
立即练习

介绍

Python 的 datetime 模块提供了一系列用于处理日期和时间的类。在本实验中,我们将探索该模块中最常用的一些类和函数,并学习如何使用它们来执行各种任务,例如处理日期、时间和时间差。

成就

  • datetime 模块
这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 100%。获得了学习者 100% 的好评率。

导入 Datetime 模块

要开始使用 datetime 模块,我们首先需要导入它。

打开一个新的 Python 解释器会话:

python3

可以通过以下代码行实现导入:

import datetime

处理日期

datetime 模块提供了 date 类用于处理日期。要创建一个表示特定日期的日期对象,我们可以使用 date() 构造函数,它接受三个参数:年、月和日。例如:

d = datetime.date(2021, 12, 31)
print(d)

这将创建一个表示 2021 年 12 月 31 日的日期对象,并以 "YYYY-MM-DD" 的格式打印出来。

处理时间

除了日期,datetime 模块还提供了 time 类用于处理时间。要创建一个表示特定时间的时间对象,我们可以使用 time() 构造函数,它接受三个参数:小时、分钟和秒。例如:

t = datetime.time(12, 30, 15)
print(t)

这将创建一个表示 12:30:15 PM 的时间对象,并以 "HH:MM:SS" 的格式打印出来。

结合日期和时间

要同时处理日期和时间,我们可以使用 datetime 类,它将日期和时间结合在一起。要创建一个表示特定日期和时间的 datetime 对象,我们可以使用 datetime() 构造函数,它接受六个参数:年、月、日、小时、分钟和秒。例如:

dt = datetime.datetime(2021, 12, 31, 12, 30, 15)
print(dt)

这将创建一个表示 2021 年 12 月 31 日 12:30:15 PM 的 datetime 对象,并以 "YYYY-MM-DD HH:MM:SS" 的格式打印出来。

处理时间差(Timedelta)

除了处理特定的日期和时间,datetime 模块还提供了 timedelta 类用于处理时间间隔。一个 timedelta 对象表示一段时间的持续时间,可以将其与 datetime 对象相加或相减,从而生成一个新的 datetime 对象。例如:

d1 = datetime.date(2021, 12, 31)
d2 = d1 + datetime.timedelta(days=1)
print(d2)

这将创建一个表示一天的 timedelta 对象,将其与 date 对象 d1 相加,并生成一个表示 2022 年 1 月 1 日的新 date 对象,并以 "YYYY-MM-DD" 的格式打印出来。

格式化日期和时间

datetime 模块提供了 strftime() 方法,可用于将 datetime 对象格式化为字符串。该方法接受一个格式字符串作为参数,用于指定输出字符串的格式。例如,以下代码将 datetime 对象格式化为 "YYYY-MM-DD HH:MM:SS" 格式的字符串:

dt = datetime.datetime(2021, 12, 31, 12, 30, 15)
s = dt.strftime('%Y-%m-%d %H:%M:%S')
print(s)

它将打印 "2021-12-31 12:30:15"。

从字符串解析日期和时间

datetime 模块还提供了 strptime() 类方法,可用于解析字符串并创建 datetime 对象。该方法接受两个参数:要解析的字符串和一个指定输入字符串预期格式的格式字符串。例如,以下代码解析格式为 "YYYY-MM-DD HH:MM:SS" 的字符串并创建一个 datetime 对象:

s = '2021-12-31 12:30:15'
dt = datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S')
print(dt)

它将打印 "2021-12-31 12:30:15"。

格式字符串是一个字符序列,对应日期和时间的不同部分,例如年、月、日、小时、分钟和秒。

以下是一些格式字符串中最常用的字符:

  • %Y:带世纪的年份,以十进制数表示。例如,"2022"
  • %m:月份,以零填充的十进制数表示。例如,"01" 表示一月,"12" 表示十二月
  • %d:月份中的天数,以零填充的十进制数表示。例如,"01" 表示月份的第一天,"31" 表示月份的最后一天
  • %H:小时(24 小时制),以零填充的十进制数表示。例如,"00" 表示午夜,"12" 表示中午,"23" 表示晚上 11 点
  • %M:分钟,以零填充的十进制数表示。例如,"00" 表示整点,"30" 表示半点
  • %S:秒,以零填充的十进制数表示。例如,"00" 表示分钟的开始,"59" 表示分钟的结束

除了这些字符外,格式字符串还可以包含与输入字符串匹配的字面字符。例如,以下格式字符串将匹配格式为 "YYYY-MM-DD" 的日期:

fmt = '%Y-%m-%d'

strptime() 方法将使用此格式字符串解析输入字符串,并从中提取年、月和日。

需要注意的是,格式字符串必须与输入字符串完全匹配,否则会引发异常。如果不确定输入字符串的格式,可以使用 tryexcept 语句来处理可能引发的异常。

此外,由于一些问题(例如它不是线程安全的且速度较慢),strptime() 方法并不被广泛推荐。建议使用 dateutil.parser.parse() 函数,它更灵活且更高效。

处理时区

datetime 模块还提供了 pytz 库,可用于处理时区。要使用它,你需要先在命令行中运行 pip install pytz 来安装它。

安装完成后,你可以使用 pytz.timezone 函数为特定时区创建一个时区对象,例如:

from datetime import datetime
import pytz

dt = datetime.now(pytz.timezone('US/Pacific'))
print(dt)

这将创建一个包含当前日期和时间的 datetime 对象,时间基于太平洋时间(美国)时区,并以 "YYYY-MM-DD HH:MM:SS-TZ" 的格式打印出来。

总结

在本实验中,我们探索了 Python datetime 模块中一些最常用的类和函数,并学习了如何使用它们来执行各种任务,例如处理日期、时间和时间差。我们了解了如何使用适当的构造函数创建 datetimedatetime 对象,以及如何将它们组合起来表示特定的时间点。我们还学习了 timedelta 类,它可以用来表示时间间隔,以及如何用它来对 datetime 对象执行算术运算。

除了本实验中提供的示例外,datetime 模块还提供了许多其他函数和类,用于处理时区、格式化日期和时间,以及从字符串中解析日期和时间。它是一个功能强大且多用途的模块,可用于解决 Python 中各种与时间相关的问题。

在本实验中,我们探索了 Python datetime 模块的一些高级功能,包括日期和时间格式转换以及时区转换。我们学习了如何使用 strftime()strptime() 方法将日期和时间格式化为字符串或从字符串中解析日期和时间,以及如何使用 pytz 库处理时区。借助这些工具,你应该能够有效地处理 Python 中的日期和时间,并解决各种与时间相关的问题。