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

Bash 生成日期+;具有给定日期的小时序列,bash,shell,unix,date,Bash,Shell,Unix,Date,给定格式为20130522的日期,我需要生成一个日期+小时序列,如下所示: 2013052112,2013052113,2013052114,...,2013052122,2013052123, 2013052200,2013052201,2013052202,...,2013052222,2013052223, 2013052300 其中,第一个日期+小时是给定日期前12小时,最后一个日期+小时是给定日期第二天的午夜 我试过几种方法,但没有一种是理想的。如何使用shell脚本以干净的方式生成

给定格式为
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

您可以使用日期和大括号展开:

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
输出(已包装):


你的代码很好。我认为您使用了如此多的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

请说明你的方法,这样我们就可以带你找到解决方案。@fedorqui:事实上,我的解决方案不可行,而且看起来很混乱,所以我宁愿从头开始。我们有时都很困惑,以至于我们更愿意从头开始。无论如何,最好至少显示一些伪代码、变量调用、程序结构。。。相信我,这会带来更好的答案。例如,你是从用户那里得到数据还是硬编码的?那么小时呢?从你的解决方案中,我只得到了
H
格式的小时,而不是
HH
,例如
…201305221 201305222 201305223 201305224 201305222 201305222 201305222 2013052227 2013052227 201305228 201305229…
@Rock:你的bash对于这个功能来说可能太旧了。将
{00…23}
更改为
{0{0..9},{10..23}
。很好!这比我的干净多了。谢谢希望有帮助:)看你的代码是一个很好的参考点,你离解决方案很近。
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