简介
处理日期时间可能是一个挑战,在Python中处理日期时间也不例外。 Python内置的datetime 模块向我们介绍了几个类--date,datetime,time,timezone 和timedelta ,而且还产生了几个外部库来解决官方模块中存在的问题,如Arrow.Cube。
在本指南中,我们将看看如何在Delorean中比较日期对象。 Delorean- 一个建立在**pytz基础上的库,pytz是解决与时区有关的问题的标准库,而dateutil**是用来计算任何两个给定的数据时间对象之间的deltas。
安装Delorean 建立一个虚拟环境
Delorean可以通过pip 进行安装。一般来说,在虚拟环境中工作是明智的,因为它可以使你把不同项目所需的依赖关系隔离开来。
在Linux或MacOS上创建一个虚拟环境,我们要运行。
$ python3 -m venv env
$ source env/bin/activate
$ python3 -m pip install delorean
或者,在Windows上,我们可以运行。
$ virtualenv env
$ .\env\Scripts\activate
$ python3 -m pip install delorean
使用Delorean比较没有时区的日期时间(Naive Datetime)。
让我们从比较不含时区的日期开始--不含时区信息的日期,但代表一个特定的时间点。也就是说--你可以设置一个Delorean 对象的timezone ,但是,当打印回来时,它将是UTC的。
from delorean import Delorean
import datetime
naive_d1 = Delorean(datetime=datetime.datetime(2021, 5, 15), timezone='UTC').naive
naive_d2 = Delorean(datetime=datetime.datetime(2021, 5, 15, 5), timezone='UTC').naive
naive_d3 = Delorean(datetime=datetime.datetime(2021, 5, 15, 5), timezone='US/Central').naive
print("naive_d1 == naive_d2 is", naive_d1 == naive_d2)
print("naive_d2 > naive_d1 is", naive_d2 > naive_d1)
print("naive_d3 == naive_d2 + 5h is", naive_d3 == naive_d2 + datetime.timedelta(hours=5))
这就导致了
naive_d1 == naive_d2 is False
naive_d2 > naive_d1 is True
naive_d3 == naive_d2 + 5h is True
naive_d1 不等于 ,因为它有naive_d2 更多的信息--时间被定义了,因此不是默认的(中午)。
这使得naive_d2 "大于 "naive_d1 ,因为它在一个较晚的时间点。
naive_d3 是在一个与naive_d2不同的时区,但这很容易纠正,只需在 中增加一个5小时的 来匹配它们,并且 会因它们相等而被返回。naive_d2 timedelta True
如果你要打印出naive_d2 和naive_d3 ,即使它们都被设置为早上5点。
print(naive_d2)
print(naive_d3)
你会得到一个移位的结果,因为它们都被匹配到UTC。
2021-05-15 05:00:00
2021-05-15 10:00:00
使用Delorean比较日期与时区(感知日期)的关系
意识到时区的日期并不是与单一的时区相匹配的。如果你做了两个日期,在两个不同的时区表示相同的时钟时间。
d1 = Delorean(datetime=datetime.datetime(2021, 5, 15, 5), timezone='UTC')
d2 = Delorean(datetime=datetime.datetime(2021, 5, 15, 5), timezone='Africa/Lagos')
如果你把它们打印出来--它们都表示早上5点,但在不同的时区。
print(d2)
print(d3)
这就导致了
Delorean(datetime=datetime.datetime(2021, 5, 15, 5, 0), timezone='UTC')
Delorean(datetime=datetime.datetime(2021, 5, 15, 5, 0), timezone='Africa/Lagos')
这使得比较的结果与天真的日期有点不同--d2 ,是否等于d3 ?他们都表示相同的时钟时间,但不是同一时间点。Delorean会比较两个Delorean 对象是否表示同一个时间点,所以它们在图书馆的眼中是不一样的。
不过,你可以把时间加到时区的日期上,使其相匹配。Africa/Lagos 时区只比UTC 晚一个小时,所以如果我们给它加一个小时,它们就会表示相同的时间点。
from delorean import Delorean
import datetime
d1 = Delorean(datetime=datetime.datetime(2021, 5, 15), timezone='UTC')
d2 = Delorean(datetime=datetime.datetime(2021, 5, 15, 5), timezone='UTC')
d3 = Delorean(datetime=datetime.datetime(2021, 5, 15, 5), timezone='Africa/Lagos')
print("d2 == d3 +1h is", d2 == d3 + datetime.timedelta(hours=1))
print("d1 > d3 -", d1 > d3)
此外,由于d1 没有关于小时的数据--它被设置为中午。即使d1 属于UTC ,它仍然比d3 早4小时。
d2 == d3 +1h is True
d1 > d3 - False
结论
在本指南中,我们已经看了如何在Delorean中比较无时区和有时区的日期。