2

我想编写一个 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

显然,这里的两个硬位是指定日期并按小时递增。

是否可以使用日期或其他方法轻松完成此操作?

4

3 回答 3

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

注意@which 用于表示参数中通过%+s的时间--date

于 2012-07-20T07:14:45.013 回答
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
于 2012-07-20T07:28:10.893 回答
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
  }
}'
于 2012-07-20T08:33:12.123 回答