2016-11-07 115 views
0

我试图将字符串,描述一个时间间隔,以相应的秒数。Bash - 将时间间隔字符串转换为nr。的秒

经过一些尝试我想通了,我可以用date这样的:

soon=$(date -d '5 minutes 10 seconds' +%s); now=$(date +%s) 
echo $(($soon-$now)) 

,但我认为应该有一个字符串转换,如“5分钟10秒”,以秒为相应数量的简单方法,在这个例子中是310. 有没有办法在一个命令中做到这一点?

注意:虽然便携性是有用的,但它不是我的首要任务。

回答

7

你可以开始在时代

date -d"1970-01-01 00:00:00 UTC 5 minutes 10 seconds" "+%s" 
310 

你也可以很容易地在次

Time="1 day" 
date -d"1970-01-01 00:00:00 UTC $Time" "+%s" 
86400 
1

有做到这一点的一种方式,而不纯bash(可移植性)

假设你只需要一个输入字符串转换“10分10秒”的bash变量与:德使用date命令限制如下。

$ convertString="00:05:10" 
$ IFS=: read -r hour minute second <<< "$convertString" 
$ secondsValue=$(((hour * 60 + minute) * 60 + second)) 
$ printf "%s\n" "$secondsValue" 
310 

可以直接在命令行而不$标记运行上述命令。

+0

我没有给予好评答案的原因是因为这并没有回答我的问题。我试图以“5分10秒”的格式转换一个字符串。如果我已经以“hh:mm:ss”的形式拥有它,那么它确实很容易 –

0

编辑子:是。我在开发了之后发表评论,并在Mac OS X,CentOS和Ubuntu上进行了检查。一种班轮兼容POSIX的命令,用于将“X分钟Y秒”格式转换为秒。 这就是问题

echo $(($(echo "5 minutes 10 seconds" | cut -c1-2)*60 + $(echo "5 minutes 10 seconds" | cut -c1-12 | awk '{print substr($0,11)}'))) 

OP通过评论告诉我他希望“X分钟Y秒”格式不适用于HH:MM:SS格式。带有date"+%s"的命令在(我的)Mac上发生错误。 OP希望从“X分钟Y秒”格式获取数值并将其转换为秒。第一I中提取数位(把它作为方程A)的分:

echo "5 minutes 10 seconds" | cut -c1-2) 

然后我萃取秒部分(把它作为方程B):

echo "5 minutes 10 seconds" | cut -c1-12 | awk '{print substr($0,11)}' 

60现在相乘分钟,然后添加与其他:

echo $((equation A)*60) + (equation B)) 

OP应该问别人使用它自动重新之前检查命令我发育版本(但工作)像我们在生产服务器上用cron做的一样。

如果我们想在一个日志文件上运行这个值为“X分钟Y秒”格式的值,我们必须像命令一样将echo "5 minutes 10 seconds"更改为cat file | ...I kept a gist of it too如果我或其他人需要,我们可以使用它与cat运行在与日志格式x minutes y seconds类似的服务器日志文件。

虽然偏离主题(我的理解,问题还没有很多工作要做,当前时间),这是不工作的POSIX兼容的操作系统以秒为单位获取当前时间:

date -d "1970-01-01 00:00:00 UTC 5 minutes 10 seconds" "+%s" 

它会抛出错误在MacOS X上,但在大多数GNU/Linux发行版上工作。 +%s部分会在复杂的使用情况下在POSIX兼容的操作系统上抛出错误。这些命令大多适用于符合任何一种UNIX的操作系统一样对POSIX秒获得当前时间:

awk 'BEGIN{srand(); print srand()}' 
perl -le 'print time' 

如果OP需要可以在几秒钟内产生电流的时间延长,并减去。我希望这会有所帮助。

----编辑先老答案----

您可以获取当前时间不说date - echo | awk '{print systime();}'wget -qO- http://www.timeapi.org/utc/now?\\s。其他将时间转换为秒的方法是echo "00:20:40.25" | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }'

在另一个答案中显示的printf的示例接近完美。

你想要的东西总是需要通过的GNU/Linux的基本工具 - gnu.org/../../../../../Setting-an-Alarm.html

这样才能真正方法取决于你有多少万无一失的方法需要。

+0

这不会帮助我,因为我试图以“5分10秒”的格式转换字符串。如果我已经以“hh:mm:ss”的形式出现了,那么它确实很容易 –

+0

请检查我编辑的答案。 –

1

这样做(添加划时代19700101):

$ date -ud '19700101 5 minutes 10 seconds' +%s 
310 

添加-u避免局部时间(和DST)的影响是很重要的。

$ TZ=America/Los_Angeles date -d '19700101 5 minutes 10 seconds' +%s 
29110 

注意,日期可能做一些数学:

$ date -ud '19700101 +5 minutes 10 seconds -47 seconds -1 min' +%s 
203