首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

UNIX 循环输出时间段,该如何处理

2012-03-16 
UNIX 循环输出时间段给定一个日期段,要求每7天一个输出循环如:给定开始日期 20120101 结束日期 20120131输

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
[解决办法]
探讨

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 \* ……

热点排行