将人类可读时间范围转换为相关的秒数

时间:2015-11-26 11:40:47

标签: linux bash shell

我正在试图弄清楚如何在我自己的一个脚本中的shutdown命令see manpage中实现“智能”时间解析。

那么我怎样才能在bash脚本中进行这些转换呢?

now -> 1448537350
+30 -> 1448539150
+1h -> 1448540950
+1d -> 1448623750
00:00 -> 1448582400

我目前的解决方案不是很好,只支持+/-XX格式,但并不真正解析传入的参数,而只是使用参数进行数学运算:

#!/bin/bash
TIME=$(date "+%s")
let TIME=$TIME$1
echo $TIME

这样称呼

./script.sh +3600 #in 1 hour

那么有什么我可以重复使用人类可读时间范围作为参数吗?

干杯

3 个答案:

答案 0 :(得分:4)

像这样:

date -d 'now' +%s
date -d '+30min' +%s
date -d '+1hour' +%s
date -d '00:00' +%s

我希望有所帮助。如需进一步阅读,我建议man date

答案 1 :(得分:1)

如果可以使用外部工具,您可以尝试使用dateutil工具。

以下是一个例子:

  

DATEADD

     

在shell中执行日期算术(日期数学)的工具。给定日期和持续时间列表,这将计算新日期。给定持续时间和日期列表,这将计算新的日期。

     

$ dateadd 2010-02-02 +4d

     

=>

     

2010-02-06

     

$ dateadd 2010-02-02 +1w

     

=>

     

2010-02-09

     

$ dateadd -1d <<EOF 2001-01-05 2001-01-01 EOF

     

=&GT;

     

2001-01-04 2000-12-31

     

将持续时间添加到时间:

     

$ dateadd 12:05:00 +10m

     

=&GT;

     

12:15:00

     

甚至是日期时间:

     

$ dateadd 2012-03-12T12:05:00 -1d4h

     

=&GT;

     

2012-03-11T08:05:00

答案 2 :(得分:0)

您可以使用date命令检查参数是否是人类可读的。如果没有,那么您可以使用正则表达式检查它是否为数字。一个例子是这样的:

#!/bin/bash
TIME=$(date "+%s")

if date -d "$1" "+%s" > /dev/null 2>&1; then ## Human Readable Format
  d=$(date -d "$1" "+%s")
  let TIME=$TIME+$d
  echo $TIME
elif [[ $1 =~ ^[+-]+{1}[0-9]+$ ]]; then ## Numerical Value
  let TIME=$TIME$1
  echo $TIME
else
  echo "Parsing Error!"
fi