1

给定格式的日期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
4

2 回答 2

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
于 2013-06-05T08:50:17.560 回答
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
于 2013-06-05T09:45:16.257 回答