生成具有给定日期的日期+小时序列

时间:2013-06-05 08:38:25

标签: bash shell unix date

给定20130522格式的日期,我需要生成一个日期+小时序列,如下所示:

2013052112,2013052113,2013052114,...,2013052122,2013052123,
2013052200,2013052201,2013052202,...,2013052222,2013052223,
2013052300

其中第一个日期+小时是指定日期之前的12小时,最后一个日期+小时是指定日期第二天的午夜。

我试过几种方法,但没有一种是理想的。如何使用shell脚本以干净的方式生成这样的序列?谢谢!

- 编辑 -

根据您的要求,这是我目前所拥有的:

day=20130522
begin=`date --date "$day -12 hours"`
begin=`date -d "${begin:0:8} ${begin:8:2}" +%s`
end=`date --date "$day +1 day"`
end=`date -d "${end:0:8} ${end:8:2}" +%s`
datestr=`date -d @${begin} +%Y%m%d%H`
let begin=$begin+3600
while [ $begin -le $end ]
do
  hr=`date -d @${begin} +%Y%m%d%H`
  datestr="$datestr,$hr"
  let begin=$begin+3600
done

这就是我从上面得到的:

2013052100,2013052101,2013052102,...,2013052123,
2013052200,2013052201,2013052202,...,2013052223,
2013052300

2 个答案:

答案 0 :(得分:2)

您可以使用date并支持扩展:

date=20130522
echo $(date -d "-1 day $date" +%Y%m%d){12..23} \
     "$date"{00..23} \
     $(date -d "+1 day $date" +%Y%m%d)00

输出(包裹):

2013052112 2013052113 2013052114 2013052115 2013052116 2013052117 2013052118 2013052119 2013052120
2013052121 2013052122 2013052123 2013052200 2013052201 2013052202 2013052203 2013052204 2013052205
2013052206 2013052207 2013052208 2013052209 2013052210 2013052211 2013052212 2013052213 2013052214
2013052215 2013052216 2013052217 2013052218 2013052219 2013052220 2013052221 2013052222 2013052223
2013052300

答案 1 :(得分:1)

你的代码非常好。我认为你使用了如此多的bash转换,而date非常强大并且处理起来更简单。

我重写了一些东西,现在我明白了:

day=20130522
begin=$(date --date "$day -12 hours" "+%s")
end=$(date --date "$day +1 day" "+%s")
hr=$(date --date "@$begin" "+%s")

while [[ $hr -lt $end ]]
do
  hr=$(($hr + 3600))
  echo $(date -d "@$hr" "+%Y%m%d %H")
done


$ ./script
20130521 13
20130521 14
.../...
20130522 22
20130522 23
20130523 00