我想写一个bash脚本,用以下格式打印出日期:
20120205_16
(year)(month)(day)_(24 hour)
所以当前日期的命令是:
date +'20%y%m%d_%H'
我想要做的是从指定日期到另一个日期打印这样的日期(使用for循环或其他东西)。例如:
20120205_16 -> 20120305_18 would be:
20120205_16
20120205_17
20120205_18
...
20120305_17
20120305_18
显然,这里的两个硬位是指定日期并按小时递增。
是否可以使用日期或其他方法轻松完成此操作?
答案 0 :(得分:5)
首先,您使用time_t
格式获取%s
值:
start=$(date --date '5 feb 2012 16:00' +%s)
stop=$(date --date '5 mar 2012 18:00' +%s)
这些以秒表示。您可以对其值使用for循环,将它们增加1小时(3600秒):
for t in $(seq ${start} 3600 ${stop})
do
date --date @${t} +'%Y%m%d_%H'
done
请注意@
,用于表示%+s
参数中--date
获得的时间。
答案 1 :(得分:1)
我已经编写了一套用于日常摆弄的命令行工具(dateutils)。它绝对不是广泛传播,而是便携式。
对于这类任务,dseq
是你的朋友,你的例子归结为:
dseq '2012-02-05 16:00:00' 1h '2012-03-05 18:00:00' -f '%Y%m%d_%H'
=>
20120205_16
20120205_17
20120205_18
...
20120305_16
20120305_17
20120305_18
答案 2 :(得分:1)
这也可以在Gawk中很好地完成:
gawk -v start="2011 10 10 10 00 00" \
-v end="2011 11 10 10 00 00" '
BEGIN {
time = mktime( start )
end = mktime( end )
while ( time <= end ) {
print strftime( "%Y%m%d_%H", time )
time +=3600
}
}'