日期:2014-05-16  浏览次数:20668 次

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/sh

START=$1
END=$2

while (( $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/ksh

i=0
set -A dtstr

cal 1 2012 | sed -n '3,$p' | xargs -n1 echo |\
while read a
do
    ((i=i+1))
    dtstr[$i]=`printf "2012%02d%02d" 1 $a`
done

j=1
while [[ $j -le $i ]]
do
    echo ${dtstr[$j]}
    ((j=j+1))
done

------解决方案--------------------
C/C++ code
#!/bin/bash

if [ $# -lt 2 ];then
        echo "invalid arguments...";
        exit 1;
fi

start_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 );
done

if [ "$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;
fi
owenliang@linux-7lsl:~/csdn/shell> ./file.sh 20120101 20120131
20120101 --- 20120107
20120108 --- 20120114
20120115 --- 20120121
20120122 --- 20120128
20120129 --- 20120131

------解决方案--------------------
探讨

C/C++ code
#!/bin/bash

if [ $# -lt 2 ];then
echo "invalid arguments...";
exit 1;
fi

start_time=$( date -d $1 +"%s" );
end_time=$( date -d $2 +"%s" );
blank_time=$( expr 7 \* 24 \* ……