You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将ps -p {PID} -o etime=的输出转换为PHP DateTime格式?

解决PHP7.1无法解析ps命令返回的dd-hh:mm:ss格式运行时长问题

嘿,这个问题我之前也踩过坑!ps的etime输出格式确实有点反直觉,24小时内是hh:mm:ss,超过就自动变成dd-hh:mm:ss,PHP7.1的标准日期函数确实不认这种非规范格式。给你两个靠谱的解决方案:

方案1:直接获取总秒数(最省心高效)

其实ps命令本身就支持直接返回进程运行的总秒数,完全不用去解析那些奇怪的格式。你只需要把参数从etime换成etimes就行:

// 获取进程1696的运行总秒数(trim去掉多余空格)
$totalSeconds = trim(shell_exec('ps -p 1696 -o etimes='));

// 转换成易读的天-时:分:秒格式
$days = floor($totalSeconds / 86400);
$remaining = $totalSeconds % 86400;
$hours = floor($remaining / 3600);
$remaining %= 3600;
$minutes = floor($remaining / 60);
$seconds = $remaining % 60;

$formattedDuration = sprintf('%d-%02d:%02d:%02d', $days, $hours, $minutes, $seconds);
echo $formattedDuration;

这个方法最直接,拿到的是纯数字,完全不用处理格式兼容问题,PHP随便怎么计算转换都很灵活。

方案2:手动解析etime字符串(如果必须保留etime参数)

如果你因为某些限制必须使用etime的输出,那可以自己写个解析函数来兼容两种格式:

function parseEtimeToSeconds($etimeStr) {
    $etimeStr = trim($etimeStr);
    $days = 0;
    $hours = 0;
    $minutes = 0;
    $seconds = 0;

    // 判断是否包含天数部分
    if (strpos($etimeStr, '-') !== false) {
        list($days, $timePart) = explode('-', $etimeStr, 2);
        list($hours, $minutes, $seconds) = explode(':', $timePart);
    } else {
        list($hours, $minutes, $seconds) = explode(':', $etimeStr);
    }

    // 转换成总秒数返回
    return (int)$days * 86400 + (int)$hours * 3600 + (int)$minutes * 60 + (int)$seconds;
}

// 使用示例
$rawEtime = shell_exec('ps -p 1696 -o etime=');
$totalSeconds = parseEtimeToSeconds($rawEtime);

// 也可以转换成DateTime对象计算时间差
$startTime = (new DateTime())->sub(new DateInterval("PT{$totalSeconds}S"));
echo '进程启动时间:' . $startTime->format('Y-m-d H:i:s');
echo '<br>运行时长:' . $startTime->diff(new DateTime())->format('%d天%H小时%I分钟%S秒');

这个函数会自动识别输入格式,拆分出天、时、分、秒后计算总秒数,之后你可以转换成任何需要的展示格式,或者用DateTime处理时间差。

两种方案里我更推荐第一种,毕竟直接拿总秒数省去了很多解析的麻烦,效率也更高。

内容的提问来源于stack exchange,提问作者nook

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:53:02