进行日期时间转换和计算的几个Shell小函数

当你遇到一个date命令不给力的系统时,可以试试这几个小函数。


#日期转天数


    function date2days {
        echo "$*" | awk '{
            z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3;
            j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633;
            print j
        }'
    }
    date2days `echo "2010-08-18 18:59:19" | sed 's/-/ /g;s/:/ /g'`


复制代码
#天数转日期


    function days2date {
        echo "$1" | awk '{
            a=$1+2472632; b=int((4*a+3)/146097); c=int((-b*146097)/4)+a;
            d=int((4*c+3)/1461); e=int((-1461*d)/4)+c; m=int((5*e+2)/153);
            dd=-int((153*m+2)/5)+e+1; mm=int(-m/10)*12+m+3; yy=b*100+d-4800+int(m/10);
            printf ("%4d-%02d-%02d\n",yy,mm,dd)
        }'
    }
    days2date 14839


复制代码
#日期转分钟


    function date2minutes {
        echo "$*" | awk '{
            z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3;
            j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633;
            j=j*1440+$4*60+$5
            print j
        }'
    }
    date2minutes `echo "2010-08-18 18:59:19" | sed 's/-/ /g;s/:/ /g'`


复制代码
#分钟转日期


    function minutes2date {
        echo "$1" | awk '{
            i=$1; nn=i%60; i=int(i/60); hh=i%24; dd=int(i/24); i=int(i/24);
            a=i+2472632; b=int((4*a+3)/146097); c=int((-b*146097)/4)+a;
            d=int((4*c+3)/1461); e=int((-1461*d)/4)+c; m=int((5*e+2)/153);
            dd=-int((153*m+2)/5)+e+1; mm=int(-m/10)*12+m+3; yy=b*100+d-4800+int(m/10);
            printf ("%4d-%02d-%02d %02d:%02d\n",yy,mm,dd,hh,nn)
        }'
    }
    minutes2date 21369299


复制代码
#日期转秒数


    function date2seconds {
        echo "$*" | awk '{
            z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3;
            j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633;
            j=j*86400+$4*3600+$5*60+$6
            print j
        }'
    }
    date2seconds `echo "2010-08-18 18:59:19" | sed 's/-/ /g;s/:/ /g'`


复制代码
#秒数转日期


    function seconds2date {
        echo "$1" | awk '{
            i=$1; ss=i%60; i=int(i/60); nn=i%60; i=int(i/60); hh=i%24; dd=int(i/24); i=int(i/24);
            a=i+2472632; b=int((4*a+3)/146097); c=int((-b*146097)/4)+a;
            d=int((4*c+3)/1461); e=int((-1461*d)/4)+c; m=int((5*e+2)/153);
            dd=-int((153*m+2)/5)+e+1; mm=int(-m/10)*12+m+3; yy=b*100+d-4800+int(m/10);
            printf ("%4d-%02d-%02d %02d:%02d:%02d\n",yy,mm,dd,hh,nn,ss)
        }'
    }
    seconds2date 1282157959


复制代码
#日期转毫秒


    function date2milliseconds {
        echo "$*" | awk '{
            z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3;
            j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633;
            j=j*86400+$4*3600+$5*60+$6
            printf ("%d%s\n",j,$7)
        }'
    }
    date2milliseconds `echo "2010-08-18 18:59:19.073" | sed 's/-/ /g;s/:/ /g;s/\./ /g'`


复制代码
#毫秒转日期


    function milliseconds2date {
        echo "$1" | awk '{
            i=$1; ms=i%1000; i=int(i/1000); ss=i%60; i=int(i/60); nn=i%60; i=int(i/60); hh=i%24; dd=int(i/24);


    i=int(i/24);
            a=i+2472632; b=int((4*a+3)/146097); c=int((-b*146097)/4)+a;
            d=int((4*c+3)/1461); e=int((-1461*d)/4)+c; m=int((5*e+2)/153);
            dd=-int((153*m+2)/5)+e+1; mm=int(-m/10)*12+m+3; yy=b*100+d-4800+int(m/10);
            printf ("%4d-%02d-%02d %02d:%02d:%02d.%03d\n",yy,mm,dd,hh,nn,ss,ms)
        }'
    }
    milliseconds2date 1282157959073


复制代码
应用实例:


计算今天的N天之后的日期
http://bbs.chinaunix.net/viewthread.php?tid=1799398&page=1#pid12986095
计算某天的N天之后的日期
http://bbs.chinaunix.net/viewthread.php?tid=1666874&page=2#pid12605722
计算上一个星期的全部日期
http://bbs.chinaunix.net/viewthread.php?tid=1754212&page=3#pid12579440
日期时间转换成毫秒
http://bbs.chinaunix.net/viewthread.php?tid=1770107&page=2#pid12715151
日期时间转换成秒
http://bbs.chinaunix.net/viewthread.php?tid=1772312&page=1#pid12737986
判断一个数字是否为合法日期
http://bbs.chinaunix.net/viewthread.php?tid=1792476&page=2#pid12918659
计算10分钟之前的时间
http://bbs.chinaunix.net/viewthread.php?tid=1842859&page=1#pid13341073
计算指定日期和当前系统日期之间相差多少天
http://bbs.chinaunix.net/viewthread.php?tid=2316841&page=1#pid15618823

你可能感兴趣的:(linux)