比较两个Python 3日期时间对象返回"不能比较offset-naive和offset-aware datetimes:TypeError"

时间:2018-05-10 04:37:14

标签: python python-3.x datetime

我正在尝试比较datetime类型的AWS EC2实例对象与另一个表示为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可以阻止为&#34; x&#34;而运行的EC2实例。多少时间。在这种情况下,如果实例运行五分钟。终止它。 lambda本身也是使用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 :(得分:2)

主要问题是,我假设launchTime是时区感知,而datetime.now()不是(datetime.now().tzinfo == None)。

有几种方法可以解决这个问题,但最简单的方法是从launchTime删除tzinfo:if launchTime.replace(tzinfo=None) < datetime.datetime.now()-datetime.timedelta(seconds=20)应该这样做。

或者,您可以将日期时间对象转换为Unix时间戳,然后您就不必处理时区愚蠢。

答案 1 :(得分:1)

尝试这样,你必须确保安装了pytz:

import pytz

utc=pytz.UTC
launchTime = utc.localize(launchTime)