[英]Incrementing time (minutes and seconds) in bash / shell script
我需要在变量中增加分钟和秒(与时间相关)。
首先,我不确定是否将'time'变量声明为
time="00:00:00"
要么
time=$(date +00:00:00)?
从那里开始,我希望将此变量增加10分钟和秒
01:00:00增加到
时间01:10:10
01:20:20等(一直到午夜 - 00:00:00)
实现这一目标的最佳方法是什么?
我知道做$ date -d "2010-07-07 200 days"
会增加(200)天,但我不知道如何将这个例子应用于时间(分钟和秒)而不是日期?
所有回复都非常感谢。
请注意,这只是Linux。 在BSD unix(以及可能的其他人)上的date -d
做了一些显着不同的事情(和不幸的事情)。
您可以使用纪元时间 - 即自1970年1月1日00:00:00以来的秒数,例如:
#!/bin/bash
time=0
echo `date -d "1970-01-01 00:00:00 UTC $time seconds" +"%H:%M:%S"`
time=$((time + 600))
echo `date -d "1970-01-01 00:00:00 UTC $time seconds" +"%H:%M:%S"`
time=$((time + 600))
echo `date -d "1970-01-01 00:00:00 UTC $time seconds" +"%H:%M:%S"`
给出这个输出:
$ /tmp/datetest.sh
00:00:00
00:10:00
00:20:00
$
date
命令不是bash的一部分。 它由您的操作系统提供,其行为在不同的操作系统中有所不同。 值得注意的是,GNU coreutils日期(在大多数Linux发行版中)有一个-d
选项用于解释源日期,而BSD日期有一个-f
选项用于解释特定格式的输入日期,而-v
选项用于按各种单位调整时间。
您已经获得了Linux选项的可接受答案。 要完成这个,这是一个BSD(和macOS)选项:
$ for (( s=0; s<86400; s+=610 )); do date -j -v+${s}S -f '%H:%M:%S' "$time" '+%T'; done | head -5
00:00:00
00:10:10
00:20:20
00:30:30
00:40:40
这里的输出显然被修剪为5行。
当然,这仍然是特定于平台的。 如果你想要任何可以在任何地方使用bash的东西,那么只要你使用bash> 4.2,以下可能会:
$ offset=$(printf '%(%z)T\n' 0)
$ for (( s=$(( ${offset:1:2}*3600 + ${offset:3}*60 )); s<86400; s+=610 )); do printf '%(%T)T\n' "$s"; done | head -5
00:00:00
00:10:10
00:20:20
00:30:30
00:40:40
$offset
变量允许我们补偿您可能不是UTC的事实。 :)与date
解决方案一样,此步骤增加610秒,但它使用printf
的%T
格式生成输出。 您可以将时区偏移量添加或减去86400终点以获得一整天的时间。 处理这是留给读者的练习。 :-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.