我们使用的第三方脚本根据某个作业运行的分钟数来提取信息。我需要在脚本中输入此输入。
例如
这是一个例子
export etool_start=`date +"%Y%m%d%H%M:"`
我的主脚本将在开始时间和结束时间之间运行。
export etool_end=`date +"%Y%m%d%H%M"`
上述结果的输出将如下所示:201607050220:201607050230。时间是 0220 到 0230。我的脚本不接受这种日期类型,只接受像 -0010(10 分钟)这样的分钟。我怎样才能创建一个数学来帮助我得到这个结果。我给出的时间只是一个例子,采样间隔甚至可以在2分钟到120分钟到一天之间。我如何利用 date 命令来获得这种输出。
请帮忙。
谢谢。
答案1
测量自纪元 ( ) 以来的时间(以秒为单位)要简单得多,+%s
然后只需减去即可找到以秒为单位的经过时间,从秒到分钟的转换只需除以 60:
export etool_start=$(date +"%s")
do_stuff_with_etool
export etool_stop=$(date +"%s")
echo "elapsed time=$(( (etool_stop - etool_start)/60 )) minutes"
如果你确实需要人类形态的时间,你可以将它们转换。使用 GNU date
:
$ date -d "@$etool_start"
Tue Jul 5 21:30:19 PDT 2016
或者:
$ date -d "@$etool_start" "+%Y%m%d%H%M"
201607052130
有关格式化的更多信息
为了以不同的格式表示经过的时间(以分钟为单位),我们可以使用printf
。例如,要生成四位数的经过时间,我们可以使用以下格式%04i
:
$ printf '%04i\n' "$(( ($etool_stop - $etool_start)/60 ))"
0001
的格式%4i
将为我们提供一个由四个字符组成的整数 (i)。如果我们想要前导零而不是前导空格,那么我们使用%04i
.
如果我们想要数字的相反符号:
$ printf '%05i\n' "$(( ($etool_start - $etool_stop)/60 ))"
-0035
由于减号需要额外的字符,因此我们将分配的空间从 4 增加到 5: %05i
。
更多分辨率
因为上面的例子使用了 bash 的算术,它只是整数。如果您想要以分钟为单位的经过时间(包含一分钟的小数部分),bc
可以使用另一个工具,例如:
$ echo "($etool_stop - $etool_start)/60" | bc -l
1.38333333333333333333
自纪元以来的秒数是多少?
自man date
纪元以来的秒数定义为:
自 1970-01-01 00:00:00 UTC 以来的%s秒
由于它是这样定义的,因此本地时区是无关紧要的。因此,在“本地时区”或世界时 下计算它-u
没有区别:
$ date +%s; date -u +%s
1467780345
1467780345
答案2
在bash中:
$ export etool_starting=`date -u +"%s"`
$ export etool_ending=`date -u +"%s"`
如果只需要几分钟:
$ printf '%05d\n' "$(( (etool_starting - etool_ending) / 60 ))"
-0120 ### If 120 minutes have elapsed in between.