Python日期时间模块:使用timedelta、timezone和tzinfo
可以说,对任何开发人员来说,与日期和时间打交道是一项日常工作。 在处理对时间敏感的数据、调度或记录时,这一点尤其真实。
Python,凭借其强大的标准库,提供了一个简单而强大的模块datetime
来有效地处理日期和时间。
这篇文章描述了datetime
模块,它的主要类和函数,以及在Python中处理日期和时间的最佳实践。
如果你在VScode中使用Python,请看这个帖子。
1. 了解Python的日期时间模块
标准Python库中的datetime
模块包含以下函数: datetime
、
date
, time
, timedelta
, tzinfo
, 以及其他几个用于日期和时间操作的类。
让我们从最常见的类和方法开始。
1.1. datetime.datetime
这个类表示一个具有日期和时间信息的单一时间点。 它还提供了各种方法和属性来访问和操作日期和时间值。
所以首先让我们创建一个datetime
对象。
from datetime import datetime
# 当前日期和时间
now = datetime.now()
print(now)
#一个特定的日期和时间
dt = datetime(2022, 9, 15, 10, 30)
print(dt)
可以用这个对象访问以下属性
from datetime import datetime
now = datetime.now()
print(f"Year: {now.year}")
print(f"Month: {now.month}")
print(f"Day: {now.day}")
print(f"Hour: {now.hour}")
print(f"Minute: {now.minute}")
print(f"seconds: {now.second}")
print(f"Milliseconds: {now.microseconds}")
1.2 datetime.date
这个类表示一个日期(年、月、日),并提供了处理没有时间信息的日期的方法。
首先,我们将创建一个date
对象来获得我们想要的信息。
from datetime import date
# 当前日期
today = date.today()
print(today)
# 一个特定的日期
d = date(2022, 9, 15)
print(d)
1.3. datetime.time
这个类表示时间(小时、分钟、秒、毫秒),并提供了只处理时间值的方法,而没有日期信息。
创建一个time
对象来获取时间信息。
from datetime import time
# specific time
t = time(10, 30, 15)
print(t)
1.4. datetime.timedelta
这是一个非常有用的类,它代表一个时间段,可以用来对datetime{:python
对象进行计算,例如加减天数、小时或分钟。
一个timedelta{:python
对象的创建方法如下..:
from datetime import timedelta
# Declare a duration of 5 days, 3 hours, and 30 minutes in a variable
delta = timedelta(days=5, hours=3, minutes=30)
print(delta)
让我们用datetime{:python
和timedelta{:python
对象来计算一个特定的时间段。
from datetime import datetime, timedelta
now = datetime.now()
# 5天后计算
future = now + timedelta(days=5)
print(future)
# 计算 3小时前
past = now - timedelta(hours=3)
print(past)
2. 处理时区和UTC时间(UTC TIme)的问题
datetime
模块提供了timezone
类,是tzinfo
的子类,用于处理时区和UTC(协调世界时)的偏差。
它还提供了timezone
类,它是tzinfo
的一个子类。
要创建一个具有时区意识的datetime
对象,可以使用timezone
类和astimezone()
方法。
请看这个例子。
from datetime import datetime, timezone
# 当前的UTC时间
utc_now = datetime.now(timezone.utc)
print(utc_now)
# 转换到另一个时区
from pytz import timezone
tz = timezone("Asia/Seoul")
local_now = utc_now.astimezone(tz)
print(local_now)
在上面的例子中,我们使用了pytz
库,一个外部包,来处理给定的时区。
pytz
库被广泛用于处理Python中的时区转换,因为它提供了一个广泛而最新的时区数据库。
3. 日期和时间的格式化和解析
datetime
模块提供了两种有用的方法,用于将日期和时间格式化并解析为字符串。
datetime.strptime(date_string, format)
: 这个方法需要两个参数,date_string,日期和时间的字符串表示,以及format,一个指定输入字符串中日期和时间结构的格式字符串,以从字符串中提取时间信息。datetime.strftime(format)
: 这个方法需要一个参数,即format,一个指定输出字符串所需结构的格式字符串。这个方法在一个datetime对象上被调用,并根据指定的格式返回日期/时间的字符串表示。
from datetime import datetime
# 用strptime()方法从一个字符串中读取时间信息
date_string = "15-04-2023 16:30:00"
format_string = "%d-%m-%Y %H:%M:%S"
date_obj = datetime.strptime(date_string, format_string)
print(date_obj) # Output: 2023-04-15 16:30:00
# 用strftime()方法将时间信息转换为一个字符串
new_format_string = "%A, %B %d, %Y at %I:%M %p"
formatted_date = date_obj.strftime(new_format_string)
print(formatted_date) # Output: Saturday, April 15, 2023 at 04:30 PM
4. 在Python中处理日期和时间的最佳实践
到目前为止,我们已经介绍了使用Python datetime
模块处理日期和时间的基本知识。
下面是使用该模块时需要记住的一些最佳实践。
- 时区意识: 时区意识是使用
datetime
对象时的一个重要问题。 当处理不同时区的日期和时间时,总是使用datetime
对象,以避免夏令时或当地时间差异等问题。 - 我们推荐使用
pytz
库进行时区转换。pytz
库提供了一个广泛和最新的时区数据库。 它被广泛用于处理Python中的时区转换。 - 要将一个日期时间对象转换为字符串,或者从字符串中解析信息,可以使用
strftime()
和strptime()
方法。 这些方法为在Python中处理日期和时间字符串提供了一种一致而灵活的方法。
5. 总结
在这篇文章中,我们介绍了Python的datetime
模块的基础知识,包括用于处理日期和时间的主要类和函数。
我们还讨论了处理时区、格式化字符串以及解析日期和时间的最佳实践。
现在,对于更多的细节,我建议阅读 datetime (opens in a new tab) 的官方 Python 文档。 当它有意义时,官方文档总是最好的指南。
对于特定情况的解决方案,请参见 计算、比较日期/时间、转换日期/时间、打印日期/时间 员。
与日期和时间打交道是你会经常遇到的事情,所以要花时间去了解它。 一旦你掌握了它,你就可以在将来很好地完成各种日期和时间的操作任务。
