Python:如何比较两个日期/时间?

4

我有两个日期时间,分别为date_time1date_time2

2017-04-15 00:00:00
2017-04-17 15:35:19+00:00

parsed1 = dateutil.parser.parse(date_time1)
parsed2 = dateutil.parser.parse(date_time2)

如果我收到另一个名为input_date_time的日期/时间(例如2017-04-16 12:11:42+00:00),我想要执行以下操作:

#    Would like to check if `input_date_time` is within the range 
if parsed1 <= input_date_time <= parsed2:
… 

遇到了错误:TypeError: can't compare offset-naive and offset-aware datetimes

想到将日期时间分解为年、月、日、小时、分钟和秒,逐个比较。

正确的做法是什么?


你试过你建议的代码了吗?它奏效了吗?你遇到了什么错误? - Daniel Roseman
@DanielRoseman 出现了 TypeError: can't compare offset-naive and offset-aware datetimes 错误。 - Jo Ko
问题在于其中一个具有时区信息,而另一个没有。如果您想假设它们处于同一时区,请将知道时区的那个设置为“None”。 - Paul
@Paul,我该怎么做?input_date_time似乎已经意识到了本地时区。如何使parsed1parsed2也意识到时区呢? - Jo Ko
3个回答

7

这是我编辑过的(再次)示例。 我认为我们应该为每个日期时间对象提供时区数据。 假设date_time1是本地时间。 我认为我们应该将时区数据添加到date_time1中,而不是清除其他tzinfo(我的第一个示例)。

import dateutil.parser
import datetime
from pytz import utc

date_time1 ='2017-04-15 00:00:00'
date_time2 ='2017-04-17 15:35:19+00:00'
input_date_time = '2017-04-16 12:11:42+00:00'

parsed1 = dateutil.parser.parse(date_time1).astimezone(utc)
parsed2 = dateutil.parser.parse(date_time2)
input_parsed = dateutil.parser.parse(input_date_time)

if parsed1 <= input_parsed  <= parsed2: 
    print('input is between')

这个功能可以检查输入是否在parsed1parsed2之间。


1
这并不会转换时间,它只是删除了信息。那么比较就会不正确。 - OrangeDog
你可以直接使用 from pytz import utc。你确定在这里使用 localize 是正确的吗? - OrangeDog
好的,我刚刚修复了它。假设date_time1是本地时间。这比以前的更好。 - Peter

1
你需要为“naive”日期时间对象(例如你的示例中的2017-04-15 00:00:00)应用时区(使其成为TZ aware),或者将“aware”日期时间对象(例如你的示例中的2017-04-17 15:35:19+00:00)转换为“naive”对象和你要比较的日期。然后,你的TypeError错误将消失。
由于你的第二个日期具有+00:00的时区偏移量,而你的输入日期时间也是+00:00,因此让我们将UTC应用于naive的第一个日期(假设它是正确的时区),然后将其转换为你需要的任何时区(如果UTC是正确的,则可以跳过转换 - 比较现在将起作用)。
parsed1 = dateutil.parser.parse(date_time1)
parsed2 = dateutil.parser.parse(date_time2)
# make parsed1 timezone aware (UTC)
parsed1 = parsed1.replace(tzinfo=pytz.utc)

现在你的比较应该可以工作了。如果你想将任何日期应用于另一个时区,你可以使用astimezone函数。让我们将时区更改为适用于澳大利亚悉尼的时区。这里是一个时区列表https://gist.github.com/heyalexej/8bf688fd67d7199be4a1682b3eec7568
syd_tz = pytz.timezone('Australia/Sydney')
syd_parsed1 = parsed1.astimezone(syd_tz)

现在您可以使用strftime的%z和%Z参数来检查每个datetime对象所应用的时区。使用%c将以本地时间格式打印它,%x和%X也是如此。 在Python3+中:
print("Local time: %s" % syd_parsed1.strftime('%c'))
print("Offset-Timezone-Date-Time: %s" % syd_parsed1.strftime("%z-%Z-%x-%X))

希望能帮到你,当我第一次使用时,时区函数让我感到很困惑,直到我了解了%c

1
假设您有Python日期时间对象,可以使用"<"、"=="和">"符号比较两个Python对象。您无需解析它们即可进行比较。
if date_time1 <= input_date_time <= datetime_2:
    #do work

如果您没有datetime对象,那么datetime类中还有一个叫做datetime的方法,可以帮助您创建datetime对象,如果您认为它有用的话。

出现以下错误:TypeError: 无法比较偏移量感知和无偏移量的日期时间 - Jo Ko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接