提取给定日期格式 shell 脚本的月份和小时

提取给定日期格式 shell 脚本的月份和小时

我正在编写一个脚本来寻求帮助。我在脚本中使用日期格式如下(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

https://php.net/function.date-diff

答案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命令)“允许命令的输出替换命令名称”(cf man bash

  • “参数扩展/子字符串扩展”从变量中提取子字符串。

毕竟,它会产生两个“纪元秒”,将其相减,然后将结果除以 60 得到分钟。请注意,bash仅执行整数算术(不能代表ksh)。

相关内容