【问题标题】:PHP Parsing Amazon EC2 instance 'launchTime'PHP解析Amazon EC2实例'launchTime'
【发布时间】:2011-12-30 15:43:34
【问题描述】:

当您描述您的 EC2 实例时,您会得到一个 XML 节点:-

[launchTime] => 2011-10-14T09:22:37.000Z

我想将此命令与 PHP 一起使用,以测量实例已启动的秒数并采取行动。

在我看来,有很多方法可以解决这个问题,包括爆炸、字符串搜索和正则表达式。但是,最好的方法是什么?

【问题讨论】:

    标签: php parsing amazon-ec2


    【解决方案1】:
    $ts = DateTime::CreateFromFormat('Y-m-d\TH:i:s?????', '2011-10-14T09:22:37.000Z');
    echo $ts->diff(new DateTime())->format('U');
    

    假设您使用的是 PHP 5.3+

    【讨论】:

    • 谢谢 Marc,看起来很简单。我有 5.3.8,但上面写着“PHP 致命错误:找不到类 'Date'”?
    • 再次感谢马克。不幸的是,我仍然一无所获。我很想对此提供更多见解,但基本上我所看到的只是差异的非对象,所以这是它不起作用的第一个迹象。你搞定了吗?
    • 嗯。似乎字符串末尾的 .000Z 正在使 DateTime 解析器 b0rk,因此它返回 false。
    • ????? 也可以,除了那是五位数,微秒可以在 2-6 之间变化,我认为 ;)
    • 耻辱你不工作;可以将它与所有其他 DateTime 类和格式一起使用 :(
    【解决方案2】:

    最终答案:

    好的,在查看this thread 之后,我决定采用这种方法作为唯一一种似乎可以返回准确测量值的方法:

    $dt = DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $date);
    $now = new DateTime();
    echo ($now->getTimestamp() - $dt->getTimestamp())."\n";
    

    尝试:

    在 PHP 5.3 中使用类(无“U”格式):

    $dt = DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $arr['launchTime']);
    echo (new DateTime())->format('U');
    

    在 PHP 5.3 中使用过程调用(也像最终解决方案一样工作):

    $dt = date_create_from_format('Y-m-d\TH:i:s.u\Z', $arr['launchTime']);
    $now = date_create();
    echo ($now->getTimestamp() - $dt->getTimestamp());
    

    在任何版本中使用strtotime(返回错误时间):

    date_default_timezone_set('UTC');
    echo time() - strtotime($arr['launchTime']);
    

    【讨论】:

    • 嗯,我刚刚注意到“U”似乎不适用于 DateInterval(适用于所有其他日期格式);烦人...回到绘图板...
    • 是的,我不确定 strtotime 是否返回了准确的度量;它似乎没有准确地进行闰年和夏令时,according to this thread
    • 你说得对,现在是英国夏令时(格林威治标准时间 +1 小时),使用上述方法意味着我目前必须手动添加 1 小时。除此之外,我很确定构造函数取消引用是 PHP 5.4 的一个特性(不是 5.3),一切都很好!
    猜你喜欢
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 2013-10-27
    • 2016-05-31
    • 2015-06-02
    相关资源
    最近更新 更多