如何在Python中用Delorean比较日期时间--有时区和无时区

160 阅读3分钟

简介

处理日期时间可能是一个挑战,在Python中处理日期时间也不例外。 Python内置的datetime 模块向我们介绍了几个类--date,datetime,time,timezonetimedelta ,而且还产生了几个外部库来解决官方模块中存在的问题,如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_d2naive_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 ,它仍然比d34小时

d2 == d3 +1h is True
d1 > d3 - False

结论

在本指南中,我们已经看了如何在Delorean中比较无时区和有时区的日期。