【问题标题】:Python: How to compare two date/time?Python:如何比较两个日期/时间?
【发布时间】:2017-04-18 22:45:50
【问题描述】:

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

想过把它分解成年、月、日、小时、分钟和秒,然后比较每一个。

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

【问题讨论】:

  • 您尝试过建议的代码吗?它奏效了吗?你得到什么错误?
  • @DanielRoseman 得到TypeError: can't compare offset-naive and offset-aware datetimes
  • 问题是其中一个有时区而另一个没有。如果你想假设它们在同一个区域,只需将感知的时区设置为None
  • @Paul 我该怎么做? input_date_time 似乎与本地时区有关。如何让parsed1parsed2 知晓?

标签: python datetime python-dateutil


【解决方案1】:

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

【讨论】:

  • 这不会转换时间,它只是删除信息。那么比较就会不正确。
  • 你可以from pytz import utc。你确定localize 在这里做的正确吗?
  • 好的,我刚刚修好了。假设 date_time1 是本地时间。这会比上一个更好。
【解决方案2】:

假设您有 python 日期时间对象, python中的两个对象可以用“”符号进行比较。

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

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

如果您没有 datetime 对象,那么在 datetime 类中还有一个名为 datetime 的方法,如果您觉得这很有用,它可以让您创建 datetime 对象。

【讨论】:

  • 收到以下错误:TypeError: can't compare offset-naive and offset-aware datetimes
【解决方案3】:

您需要将时区应用于“naive”日期时间对象(在您的示例中为 2017-04-15 00:00:00)(以使其了解 TZ)或将“aware”日期时间对象(在您的示例中为 2017-04-17 15:35:19+00:00)转换为“ naive' 对象和您尝试比较的日期。 然后你的 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 时,我就想到了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多