如何比较python中的日期时间对象?

Posted

技术标签:

【中文标题】如何比较python中的日期时间对象?【英文标题】:How to compare datetime objects in python? 【发布时间】:2021-02-05 14:21:08 【问题描述】:

好的,在 Python 中从来没有像日期时间这样困难的东西。我有时间,my_time,这个时间总是需要在夏季增加 2 小时,在冬季增加 1 小时。 my_time 的正确时区是 EET。现在我试图将它与start_timeend_time 进行比较,但我可以看到它在执行 if 语句时仍在寻找“基础”my_time。这怎么可能?

这是我的代码:

my_time = '20200907-07u00m00s' 
my_time = datetime.datetime.strptime(my_time, '%Y%m%d-%Hu%Mm%Ss')   
timezone= 'Europe/Amsterdam'
my_time = pytz.utc.localize(my_time).astimezone(pytz.timezone(timezone))

start_time = '202097060000'
start_time = datetime.datetime.strptime(start_time, '%Y%m%d%H%M%S')
start_time = pytz.utc.localize(start_time)

end_time = '202097080000'
end_time = datetime.datetime.strptime(end_time, '%Y%m%d%H%M%S')
end_time = pytz.utc.localize(end_time)

if my_time >= start_time and my_time <= end_time: 
    print('my_time IS between the start and end time')
else:
    print('my_time IS NOT between the start and end time')

接收到的输出: my_time IS between the start and end time

我猜代码正在检查 2020-09-07 07:00:00 是否介于 2020-09-07 06:00:002020-09-07 08:00:00....

我的预期输出是代码检查是否: 2020-09-07 09:00:00 介于 2020-09-07 06:00:002020-09-07 08:00:00 之间,这意味着它应该打印 my_time IS NOT between the start and end time

【问题讨论】:

start_time 和 end_time 都是 UTC,而 my_time 是本地时间 (UTC+2)。比较考虑了 UTC 偏移量,因此 2020-09-07 09:00:00+02:00 介于 2020-09-07 06:00:00+00:002020-09-07 08:00:00+00:00 之间。 @MrFuppes 是的,我知道,这也是我在问题中所说的,但我希望 my_time 成为 2020-09-07 09:00:00 而不是 2020-09-07 09:00:00+02:00 那么你不应该本地化到时区,而是 UTC(就像你对开始和结束时间所做的那样)。 【参考方案1】:

您可以获取本地化 my_time 值的 UTC 偏移量并将其添加到 my_time

my_time = '20200907-07u00m00s' 
my_time = datetime.datetime.strptime(my_time, '%Y%m%d-%Hu%Mm%Ss')   

timezone= 'Europe/Amsterdam'
my_time_tz = pytz.utc.localize(my_time).astimezone(pytz.timezone(timezone))

timeDiff = my_time_tz.utcoffset().total_seconds()
print("UTC Offset: %s seconds" % timeDiff)
normalized_my_time = pytz.utc.localize(my_time+datetime.timedelta(seconds=timeDiff))

start_time = '202097060000'
start_time = datetime.datetime.strptime(start_time, '%Y%m%d%H%M%S')
start_time = pytz.utc.localize(start_time)

end_time = '202097080000'
end_time = datetime.datetime.strptime(end_time, '%Y%m%d%H%M%S')
end_time = pytz.utc.localize(end_time)

print(start_time , normalized_my_time , end_time)

if start_time <= normalized_my_time <= end_time: 
    print('my_time IS between the start and end time')
else:
    print('my_time IS NOT between the start and end time')

输出:

UTC Offset: 7200.0 seconds
2020-09-07 06:00:00+00:00 2020-09-07 09:00:00+00:00 2020-09-07 08:00:00+00:00
my_time IS NOT between the start and end time

【讨论】:

@MrFuppes:OP 在 cmets 中说:但我希望 my_time 为 2020-09-07 09:00:00。最后,所有 3 个日期时间都应该是本地化的或 UTC。 是的,我仍然不明白为什么它首先被本地化到某个时区。 @MauriceMeyer 介意我们来谈谈这个问题吗?

以上是关于如何比较python中的日期时间对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Netezza 中比较日期?

JS 如何比较时间大小?

比较对象数组中的日期和时间

Python:如何检查日期是不是不明确?

如何比较两个日期?

比较Python中的数据框日期时间列值? [复制]