比较EC2实例的启动时间和当前时间(Python实现)

2024-04-25 06:26:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我从EC2实例中提取启动时间,它返回如下unicode字符串:

2014-12-22T08:46:10.000Z

我使用dateutil解析器将其转换为datetime

launch_time = parser.parse(instance.launch_time)

所以像这样转换后我有午餐时间:

2014-12-22 08:46:10+00:00

我想比较这个启动时间和当前时间,看看这个实例运行了多长时间。

我的当前时间是:

current_time = datetime.datetime.now()

我是这样理解的:

2014-12-22 11:46:10.527010

现在我有两个时间戳,我有这个函数

def timeDiff(launch_time, current_time):
    running_time = current_time - launch_time
    return running_time.seconds/60

我预计结果是180分钟(3小时)。但我犯了个错误:

TypeError: can't subtract offset-naive and offset-aware datetimes

我认为这两个时间戳有明显的区别。我需要比较确切的日期和时间,看看它已经运行了多久。我找不到合适的方法来解决这个问题。任何想法都值得欣赏!


Tags: 实例字符串parser解析器datetimetimeparse时间
2条回答
import boto.ec2
from dateutil.parser import *
import subprocess
import datetime


instance_id = subprocess.check_output(['curl', '-s', 'http://169.254.169.254/latest/meta-data/instance-id'])

conn = boto.ec2.connect_to_region('ap-southeast-2',aws_access_key_id='Your_Key', aws_secret_access_key='Your_Secret')

reservations = conn.get_all_reservations(instance_ids=[instance_id])

for r in reservations:
    for instance in r.instances:
        lt_datetime = parse(instance.launch_time)
        lt_delta = datetime.datetime.now(lt_datetime.tzinfo) - lt_datetime
        uptime = str(lt_delta)
        print(uptime)

您可以从now()指定所需的时区,如下所示:

current_time = datetime.datetime.now(launch_time.tzinfo)

那么你的减法就应该起作用了,因为这两个时间都是时区感知的。

编辑:我需要注意的是,您可以将任何时区对象放在now()中,它将正常工作。now()将时间转换为您经过的任何时区。重要的一点是简单地确保如果您在添加/减去datetime对象,它们都有时区(或者都没有时区)。

相关问题 更多 >