Ошибка TypeError: can't compare offset-naive and offset-aware datetimes обычно возникает, когда вы сравниваете простой объект даты и времени, который не имеет никакой информации о часовом поясе, с известным объектом даты и времени, у которого есть часовой пояс.
Воспроизведение ошибки
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import pytz from datetime import datetime # Creating a naive datetime object date_1 = datetime(2022, 1, 1, 12, 0, 0) # Creating an aware datetime object date_2 = datetime(2023, 1, 1, 12, 0, 0, tzinfo=pytz.utc) # Comparing the two datetime objects if date_1 > date_2: print('date_1 is later than date_2') else: print('date_1 is earlier than or the same as date_2') |
Выход
|
1 |
TypeError: can't compare offset-naive and offset-aware datetimes |
Как исправить ошибку
Вот два способа исправить ошибку.
- Использование метода replace()
- Использование метода astimezone()
Решение 1. Использование метода replace()
Вы можете исправить ошибку с помощью метода replace().
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from datetime import datetime import pytz # Creating a naive datetime object date_1 = datetime(2022, 1, 1, 12, 0, 0) # Creating an aware datetime object date_2 = datetime(2023, 1, 1, 12, 0, 0, tzinfo=pytz.utc) # Creating a naive datetime object date_1 = date_1.replace(tzinfo=pytz.utc) # Comparing the two datetime objects if date_1 > date_2: print('date_1 is later than date_2') else: print('date_1 is earlier than or the same as date_2') |
Выход
|
1 |
date_1 is earlier than or the same as date_2 |
Решение 2. Использование метода astimezone()
Другое решение для исправления ошибки с помощью метода astimezone().
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from datetime import datetime from dateutil import tz # Creating a naive datetime object date_1 = datetime(2022, 1, 1, 12, 0, 0) # Creating an aware datetime object date_2 = datetime(2023, 1, 1, 12, 0, 0, tzinfo=tz.tzutc()) # Converting date_1 to the same timezone as date_2 date_1 = date_1.astimezone(date_2.tzinfo) # Comparing the two datetime objects if date_1 > date_2: print('date_1 is later than date_2') else: print('date_1 is earlier than or the same as date_2') |
Выход
|
1 |
date_1 is earlier than or the same as date_2 |
Основное различие между объектами datetime, заключается в том, что объект datetime не знает никакой информации о часовом поясе, тогда как «осведомленный» объект datetime знает о конкретном часовом поясе. Он способен правильно учитывать переход на летнее время и другие изменения часового пояса.
