Python: How to compare two date/time?

可紊 提交于 2019-12-10 11:41:26

问题


I have the following two date/time which are date_time1 and date_time2 respectively:

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)

and would if I were to receive another date/time called input_date_time (e.g. 2017-04-16 12:11:42+00:00), would like to do the following:

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

And got an error: TypeError: can't compare offset-naive and offset-aware datetimes

Thought up of breaking it down to just year, month, day, hour, minute, and second, and compare every single one.

What would be the proper way to do so?


回答1:


here is my edited (again) example I think we should provide timezone data to every datetime object assume that date_time1 is a local time. I think we should add timezone data to date_time1 instead of clear other tzinfo (my first example)

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')

this can check if input is between parsed1 and parsed2




回答2:


Assuming you have python datetime obejcts, two objects in python can be compared with the "<", "==", and ">" signs.

You don't need to parse them to compare them.

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

If you don't have datetime objects, there is also a method called datetime in the datetime class, which will allow you to create datetime objects, if you'll find that useful.




回答3:


You need to apply a timezone to the 'naive ' datetime object (2017-04-15 00:00:00 in your example) (to make it TZ aware) OR convert the 'aware' datetime object (2017-04-17 15:35:19+00:00 in your example) to a 'naive' object and the date you are trying to compare. Then your TypeError will disappear.

Since your second date has a timezone offset of +00:00 and your input_datetime is also +00:00, let's apply UTC to the naive first date (assuming that it's the correct timezone) and then convert it to whatever timezone you need (you can skip the conversion if UTC is correct - the comparison will now work.)

parsed1 = dateutil.parser.parse(date_time1)
parsed2 = dateutil.parser.parse(date_time2)
# make parsed1 timezone aware (UTC)
parsed1 = parsed1.replace(tzinfo=pytz.utc)

Now your comparison should work. If you want to apply another timezone to any of the dates, you can use the astimezone function. Lets change the timezone to that applicable to Sydney, Australia. Here is a list of timezones https://gist.github.com/heyalexej/8bf688fd67d7199be4a1682b3eec7568

syd_tz = pytz.timezone('Australia/Sydney')
syd_parsed1 = parsed1.astimezone(syd_tz)

You can now check what timezone is applied to each of your datetime objects using the %zand %Z parameters for strftime. Using %c will print it in the local time format as will %x and %X. Using Python3+:

print("Local time: %s" % syd_parsed1.strftime('%c'))
print("Offset-Timezone-Date-Time: %s" % syd_parsed1.strftime("%z-%Z-%x-%X))

Hope that helps, the timezone functions did my head in when I used them the first time when I didn't know about %c.



来源:https://stackoverflow.com/questions/43483420/python-how-to-compare-two-date-time

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!