Сравнение двух объектов Python 3 datetime возвращает «невозможно сравнить смещенные наивные и смещенные datetime: TypeError» - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь сравнить время экземпляра объекта 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 ]

0 голосов
/ 10 мая 2018

Основная проблема в том, что я предполагаю, что launchTime относится к часовому поясу, тогда как datetime.now() не (datetime.now().tzinfo == None).

Есть несколько способов решить эту проблему, но проще всего было бы удалить tzinfo из launchTime: if launchTime.replace(tzinfo=None) < datetime.datetime.now()-datetime.timedelta(seconds=20) должно сработать.

Кроме того, вы можете конвертировать ваши объекты даты и времени в метки времени Unix, и тогда вам не придется иметь дело с глупостью часового пояса.

0 голосов
/ 10 мая 2018

Попробуйте вот так, убедитесь, что установлен pytz:

import pytz

utc=pytz.UTC
launchTime = utc.localize(launchTime) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...