![提取给定日期格式 shell 脚本的月份和小时](https://linux22.com/image/168178/%E6%8F%90%E5%8F%96%E7%BB%99%E5%AE%9A%E6%97%A5%E6%9C%9F%E6%A0%BC%E5%BC%8F%20shell%20%E8%84%9A%E6%9C%AC%E7%9A%84%E6%9C%88%E4%BB%BD%E5%92%8C%E5%B0%8F%E6%97%B6%20.png)
我正在编写一个脚本来寻求帮助。我在脚本中使用日期格式如下(YYYY MM DD HH MM):
$ echo $DT
202002252216
现在我的要求是比较文件中列出的两个日期并计算以小时为单位的输出。
cat /home/postgres/pglinux_mm_cfg
MM_START=202002261015
MM_END=202002261530
MM_SERVER=pglinux
这是我的脚本,timediff.sh
ENV=/home/postgres
MM_START=`grep MM_START ${ENV}/\`hostname\`_mm_cfg |awk -F"=" '{print $2}'`
MM_END=`grep MM_END ${ENV}/\`hostname\`_mm_cfg |awk -F"=" '{print $2}'`
MPHR=60
STARTIME=$(date +%Y%m%d%H%M -d ${MM_START})
ENDTIME=$(date +%Y%m%d%H%M -d ${MM_END})
MINUTES=$(( ($ENDTIME - $STARTIME) / $MPHR ))
echo $STARTIME $ENDTIME $MINUTES
如何获取 MM_END 和 MM_START 之间的日期和小时数差异?
我在用ksh
。
答案1
这可能不是您想要的,但是如果使用适当的编程语言,这会简单得多。以 PHP 为例:
<?php
$o1 = date_create('202002261015');
$o2 = date_create('202002261530');
$o3 = date_diff($o2, $o1);
echo 'days: ', $o3->d, ', hours: ', $o3->h, "\n";
结果:
days: 0, hours: 5
答案2
应该适用(但未经测试)ksh
:
echo "$MM_START", "$MM_END", $(( ($(date -d"${MM_END:0:8} ${MM_END:8}" +%s) - $(date -d"${MM_START:0:8} ${MM_START:8}" +%s) )/ 60 ))
202002261015, 202002261530, 315
这使用了 shell 的
“算术展开”
$((...))
来执行差分和除法“命令替换”
$(...)
(两次,对于两个date
命令)“允许命令的输出替换命令名称”(cfman bash
)“参数扩展/子字符串扩展”从变量中提取子字符串。
毕竟,它会产生两个“纪元秒”,将其相减,然后将结果除以 60 得到分钟。请注意,bash
仅执行整数算术(不能代表ksh
)。