我正在尝试获取两个日期之间的时差,如下面在Bash脚本中给出的那样。但是我没有成功
head_info: 05-31-2017:04:27:37
tail_info: 05-31-2017:04:30:57
问题在于,在上述时间改造之后,由于空间而在数秒内尝试计算时,忽略了时间。
这是我的剧本:
fm_head_info=(${head_info:6:4}"-"${head_info:0:2}"-"${head_info:3:2}" \
"${head_info:11:8})
fm_tail_info=(${tail_info:6:4}"-"${tail_info:0:2}"-"${tail_info:3:2}" \
"${tail_info:11:8})
$ fm_head_info -bash: 2017-05-31: command not found
谢谢
答案 0 :(得分:1)
让我们定义你的shell变量:
$ tail_info=05-31-2017:04:30:57
$ head_info=05-31-2017:04:27:37
现在,让我们创建一个函数将这些日期转换为second-since-epoch:
$ date2sec() { date -d "$(sed 's|-|/|g; s|:| |' <<<"$*")" +%s; }
要以秒为单位查找这两个日期之间的时差:
$ echo $(( $(date2sec "$tail_info") - $(date2sec "$head_info") ))
200
如上所述,这需要bash
(或类似的高级shell)和GNU date
。换句话说,这应该适用于任何标准Linux。为了使其在OSX上运行,可能需要对date
命令进行一些更改。
从函数date2sec
内的最里面的命令开始,我们有:
sed 's|-|/|g; s|:| |' <<<"$*"
在函数的argumnet中,这会将所有-
替换为/
,并用空格替换第一个:
。这会将日期从输入中的格式转换为GNU date
函数将理解的格式。例如:
$ sed 's|-|/|g; s|:| |' <<<"05-31-2017:04:30:57"
05/31/2017 04:30:57
使用此表单,我们可以使用date
查找秒 - 自 - 纪元:
$ date -d "05/31/2017 04:30:57" +%s
1496230257
并且,对于head_info:
$ date -d "05/31/2017 04:27:37" +%s
1496230057
现在我们已经有了,剩下的就是减去时间:
$ echo $(( 1496230257 - 1496230057 ))
200
答案 1 :(得分:1)
您的直接问题是包含错误的(...)
围绕您的字符串索引编号和您的可疑引文。它看起来像你打算:
fm_head_info="${head_info:6:4}-${head_info:0:2}-${head_info:3:2} ${head_info:11:8}"
fm_tail_info="${tail_info:6:4}-${tail_info:0:2}-${tail_info:3:2} ${tail_info:11:8}"
您对字符串索引的使用是正确的,例如
#!/bin/bash
head_info=05-31-2017:04:27:37
tail_info=05-31-2017:04:30:57
fm_head_info="${head_info:6:4}-${head_info:0:2}-${head_info:3:2} ${head_info:11:8}"
fm_tail_info="${tail_info:6:4}-${tail_info:0:2}-${tail_info:3:2} ${tail_info:11:8}"
echo "fm_head_info: $fm_head_info"
echo "fm_tail_info: $fm_tail_info"
示例使用/输出
$ bash headinfo.sh
fm_head_info: 2017-05-31 04:27:37
fm_tail_info: 2017-05-31 04:30:57
然后你可以做一些与date -d "$var" +%s
中的差异类似的事情,正如约翰在答案中所显示的那样,以达到时差。注意,字符串索引仅限于bash,而sed
解决方案(缺少 herestring )在所有POSIX shell上都是可移植的。