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

时间:2017-04-18 22:45:50

标签: python datetime python-dateutil

我有以下两个日期/时间分别是date_time22017-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

如果我要收到另一个名为# Would like to check if `input_date_time` is within the range if parsed1 <= input_date_time <= parsed2: … 的日期/时间(例如2017-04-16 12:11:42 + 00:00),我想做以下事情:

TypeError: can't compare offset-naive and offset-aware datetimes

收到错误:f

考虑将其分解为年,月,日,小时,分钟和秒,并比较每一个。

这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

这是我编辑的(再次)示例 我认为我们应该为每个日期时间对象提供时区数据 假设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 :(得分:0)

假设你有python datetime obejcts, python中的两个对象可以与&#34;&lt;&#34;,&#34; ==&#34;和&#34;&gt;&#34;进行比较。迹象。

您不需要解析它们来比较它们。

if date_time1 <= input_date_time <= datetime_2:
    #do work

如果您没有日期时间对象,则在datetime类中还有一个名为datetime的方法,如果您发现它有用,则可以创建日期时间对象。

答案 2 :(得分:0)

您需要将时区应用于“天真”的时间区域。 datetime对象(在您的示例中为2017-04-15 00:00:00)(使其能够识别TZ)或转换&#39;意识到&#39;日期时间对象(在您的示例中为2017-04-17 15:35:19+00:00)与“天真”对象对象和您要比较的日期。 然后你的TypeError就会消失。

由于您的第二个日期的时区偏移量为+00:00且您的input_datetime也为+00:00,因此我们将UTC应用于初始的第一个日期(假设它是正确的)时区),然后将其转换为您需要的任何时区(如果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参数来检查每个日期时间对象应用的时区。使用%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时,时区功能就出现了。