UNIX 循环输出时间段
给定一个日期段,要求每7天一个输出循环
如:
给定开始日期 20120101 结束日期 20120131
输出:
20120101 --- 20120107
20120108 --- 20120114
20120115 --- 20120121
20120122 --- 20120128
20120129 --- 20120131
求解UNIX脚本? 谢谢!
[解决办法]
./test.sh 20120101 20120131
20120101 --- 20120107
20120108 --- 20120114
20120115 --- 20120121
20120122 --- 20120128
20120129 --- 20120131
- PHP code
#!/bin/shSTART=$1END=$2while (( $START < $END))do if (( $(($START + 6)) < $END )) then echo $START --- $(($START + 6)) else echo $START --- $END fi START=$(($START + 7))done
[解决办法]
支持1楼
START=$(($START + 7))
也可以这么写
((START=START+7))
[解决办法]
不支持上面的
日期需要判断吧
LZ给的日期恰好 是一月的,如果是跨月、跨年的情况都没考虑。。。。
[解决办法]
看lz的应用场景了,对于跨月、跨年的是比较麻烦
lz的操作系统不是linux ?
[解决办法]
对于2012.1 一个完整月份的情况,也可以这样
cal 1 2012 | sed -n '3,$p' | xargs -n1 printf "2012%02d%02d\n" 1|paste - - - - - - -|awk '{print $1, "--", $NF}'
[解决办法]
提供一个思路
1、对于linux系统,可以把时间转换为秒数,然后根据秒数循环输出
2、对于其他系统,可以把起止时间之间的所有时间字符串都存放在一个数组中,循环输出,比较麻烦
一个简单的示例脚本,以2012.1为例
- Perl code
#!/bin/kshi=0set -A dtstrcal 1 2012 | sed -n '3,$p' | xargs -n1 echo |\while read ado ((i=i+1)) dtstr[$i]=`printf "2012%02d%02d" 1 $a`donej=1while [[ $j -le $i ]]do echo ${dtstr[$j]} ((j=j+1))done
[解决办法]
- C/C++ code
#!/bin/bashif [ $# -lt 2 ];then echo "invalid arguments..."; exit 1;fistart_time=$( date -d $1 +"%s" );end_time=$( date -d $2 +"%s" );blank_time=$( expr 7 \* 24 \* 60 \* 60 );cur_time=$start_time;pre_time="";while [ "$cur_time" -le "$end_time" ];do if [ "$pre_time" != "" ];then left=$( date -d "1970-01-01 UTC ${pre_time} seconds" +"%Y%m%d" ); temp_time=$( expr ${cur_time} - 24 \* 60 \* 60 ); right=$( date -d "1970-01-01 UTC ${temp_time} seconds" +"%Y%m%d" ); printf "%s --- %s\n" $left $right; fi pre_time=$cur_time; cur_time=$( expr $cur_time + $blank_time );doneif [ "$cur_time" -ne "$end_time" ];then left=$( date -d "1970-01-01 UTC $pre_time seconds" +"%Y%m%d" ); right=$( date -d "1970-01-01 UTC $end_time seconds" +"%Y%m%d" ); printf "%s --- %s\n" $left $right;fiowenliang@linux-7lsl:~/csdn/shell> ./file.sh 20120101 2012013120120101 --- 2012010720120108 --- 2012011420120115 --- 2012012120120122 --- 2012012820120129 --- 20120131
[解决办法]