Сравнение двух объектов Python 3 datetime возвращает "невозможно сравнить смещенные наивные и смещенные datetime: TypeError"
Я пытаюсь сравнить время экземпляра объекта AWS EC2, имеющего тип datetime, с другим datetime, представленным как datetime.datetime.now. Строка кода, о которой идет речь, выглядит так:
if launchTime < datetime.datetime.now()-datetime.timedelta(seconds=20):
Где launchTime имеет тип datetime. Однако, когда я запускаю его, я получаю ошибку
can't compare offset-naive and offset-aware datetimes: TypeError
И я не уверен, как конвертировать launchTime таким образом, чтобы я мог успешно сравнить его.
Отредактированный фиксированный код ниже -----------------------------------------
if launchTime.replace(tzinfo=None) < datetime.datetime.now()-datetime.timedelta(minutes=4):
Полный код, а также в случае, если будущие люди найдут его полезным. Это Python 3, чтобы остановить экземпляры EC2, которые работали в течение "х" времени. В этом случае, если экземпляр работает в течение пяти минут. Прекратить это. Сама лямбда настроена на Cloudwatch для запуска каждые 4 минуты.
import boto3
import time
import datetime
#for returning data about our newly created instance later on in fuction
client = boto3.client('ec2')
def lambda_handler(event, context):
response = client.describe_instances()
#for each instance currently running/terminated/stopped
for r in response['Reservations']:
for i in r['Instances']:
#if its running then we want to see if its been running for more then 3 hours. If it has then we stop it.
if i["State"]["Name"] == "running":
launchTime = i["LaunchTime"]
#can change minutes=4 to anything
if launchTime.replace(tzinfo=None) < datetime.datetime.now()-datetime.timedelta(minutes=4):
response = client.stop_instances(
InstanceIds=[
i["InstanceId"]
]
)
2 ответа
Основная проблема в том, что я предполагаю launchTime
осведомлен о часовом поясе, тогда как datetime.now()
не является (datetime.now().tzinfo == None
).
Есть несколько способов решить эту проблему, но самым простым будет удалить tzinfo из launchTime
: if launchTime.replace(tzinfo=None) < datetime.datetime.now()-datetime.timedelta(seconds=20)
должен сделать свое дело.
Кроме того, вы можете конвертировать ваши объекты даты и времени в метки времени Unix, и тогда вам не придется иметь дело с глупостью часового пояса.
Попробуйте вот так, убедитесь, что установлен pytz:
import pytz
utc=pytz.UTC
launchTime = utc.localize(launchTime)