bash - 计算bash中两个时间戳之间的差异
问题描述
我想通过减去两个时间戳来找出总系统启动时间。首先我使用这个命令来获取开始时间和结束时间:
sudo journalctl | grep "Logs begin at" | awk '{print $6" "$7" "$12" "$13}'
这让我得到以下输出:
2020-05-21 05:52:47 2020-05-28 19:37:36
(前两个字段为开始时间,后两个字段为结束时间)
现在我想找到开始时间和结束时间之间的差异,最好是格式:
“0 年,0 个月,7 天,HH:MM:SS”
解决方案
那这个呢?
#!/usr/bin/env bash
echo "BASH_VERSION:" $BASH_VERSION
line="2020-05-21 05:52:47;2020-05-28 19:37:36"
IFS=';' read -a dates <<< $line
startDatetime=${dates[0]}
endDatetime=${dates[1]}
echo "| dates -> " ${dates[@]}
echo "|> startDatetime -> ${startDatetime}"
echo "|> endDatetime -> ${endDatetime}"
startTime=$(date -jf "%Y-%m-%d %H:%M:%S" "${startDatetime}" +%s)
endTime=$(date -jf "%Y-%m-%d %H:%M:%S" "${endDatetime}" +%s)
diffSeconds="$(($endTime-$startTime))"
echo "Diff in seconds: $diffSeconds"
# at this point you have the diff in seconds and you can parse it however you want :)
diffTime=$(gdate -d@${diffSeconds} -u +%H:%M:%S) # you'll need `brew install coreutils`
echo "Diff time(H:M:S): $diffTime"
输出:
BASH_VERSION: 5.0.17(1)-release
| dates -> 2020-05-21 05:52:47 2020-05-28 19:37:36
|> startDatetime -> 2020-05-21 05:52:47
|> endDatetime -> 2020-05-28 19:37:36
Diff in seconds: 654289
Diff time(H:M:S): 13:44:49
要安装最新版本bash
,我发现了这个中型帖子。
注意:如果这不起作用,因为某些版本与该date
功能不兼容,例如,这个想法应该非常相似,你可以找到一个适应你当前版本的解决方法,我敢肯定。从逻辑上讲,我看到的最简单的解决方案是:
1st)将字符串分成两部分:每个日期时间一个。
2nd)将每个 DateTime 从字符串转换为日期。
3rd)在这些日期之间应用差异:使用每个日期的秒数。
4th)拥有不同的秒数,您可以根据需要显示它(年,日,分,秒)
推荐阅读
- c - glDrawElements() 大小为 4 的无效写入
- bash - 无法打印多列
- ruby-on-rails - 查找特定对象下的树结构中存在的所有对象
- python - EXPRESSION_STMT 在 Python 语法中是如何工作的?
- javascript - 删除后无法输入文字
- docker - 在 Docker Swarm 中使用 Docker Stack 部署时将动态值传递给每个节点
- java - 尝试在空对象引用上调用虚拟方法“void android.database.sqlite.SQLiteDatabase.execSQL(java.lang.String)”
- ios - 领域 - 如何删除没有任何关联对象的对象?
- regex - 将一系列作业拆分为自命名的组
- c - 在一页中隔离一条指令