Shell使用Epoch进行日期时间转换和计算的几个小函数
核心代码
当你遇到一个date命令不给力的系统时,可以试试这几个小函数。 #日期转天数 functiondate2days{ 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; printj }' } date2days`echo"2010-08-1818:59:19"|sed's/-//g;s/://g'` #天数转日期 functiondays2date{ 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) }' } days2date14839 #日期转分钟 functiondate2minutes{ 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 printj }' } date2minutes`echo"2010-08-1818:59:19"|sed's/-//g;s/://g'` #分钟转日期 functionminutes2date{ 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) }' } minutes2date21369299 #日期转秒数 functiondate2seconds{ 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 printj }' } date2seconds`echo"2010-08-1818:59:19"|sed's/-//g;s/://g'` #秒数转日期 functionseconds2date{ 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) }' } seconds2date1282157959 #日期转毫秒 functiondate2milliseconds{ 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-1818:59:19.073"|sed's/-//g;s/://g;s/\.//g'` #毫秒转日期 functionmilliseconds2date{ 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) }' } milliseconds2date1282157959073
应用实例:
计算今天的N天之后的日期
#!/bin/bash functiondate2days{ echo"$1$2$3"|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; printj }' } functiondays2date{ 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) }' } year=`date+%Y`;month=`date+%m`;day=`date+%d` days=`date2days$year$month$day` N=5 letdays-=$N days2date$days
计算某天的N天之后的日期
#!/bin/bash functiondate2days{ echo"$1$2$3"|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; printj }' } functiondays2date{ 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) }' } year=2010;month=01;day=20 days=`date2days$year$month$day` letdays+=5 days2date$days
计算上一个星期的全部日期
#!/bin/bash functiondate2days{ echo"$1$2$3"|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; printj }' } functiondays2date{ 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) }' } functiondate2week{ echo"$1$2$3"|awk'{ z=int((14-$2)/12);y=$1+4800-z;m=$2+12*z-3; dow=(int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472629)%7; printdow }' } year=`date+%Y`;month=`date+%m`;day=`date+%d` days=`date2days$year$month$day` week=`date2week$year$month$day` letdateEnd=$days-$week-1 letdateBegin=$dateEnd-6 for((i=$dateBegin;i<=$dateEnd;i++));do days2date$i done
日期时间转换成毫秒
functiondate2milliseconds{ 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 printj$7 }' } date2milliseconds`echo"2010-08-1818:59:19.073"|/usr/xpg4/bin/awk-F'[:.-]+''$1=$1'`
日期时间转换成秒
functiondate2seconds{ 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 printj }' } date2seconds`echo"2010-07-2100:00:00"|sed's/-//g;s/://g'`
判断一个数字是否为合法日期
functiondate2days{ 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; printj }' } functiondays2date{ 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) }' } num1=20105050 num2=20101001 arg1=`echo"$num1"|sed-r's/(....)(..)(..)/\1\2\3/g'` arg2=`echo"$num2"|sed-r's/(....)(..)(..)/\1\2\3/g'` days1=`date2days$arg1` date1=`days2date$days1` days2=`date2days$arg2` date2=`days2date$days2` ["$num1"-eq"$date1"]&&echo"$num1isvaliddate"||echo"$num1isinvaliddate" ["$num2"-eq"$date2"]&&echo"$num2isvaliddate"||echo"$num2isinvaliddate"
计算10分钟之前的时间
functiondate2minutes{ 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 printj }' } functionminutes2date{ 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) }' } now=`date"+%Y-%m-%d%H:%M"|sed's/-//g;s/://g'` minutes=`date2minutes$now` letminutes-=10 minutes2date$minutes
计算指定日期和当前系统日期之家相差多少天
#!/bin/bash functiondate2days{ 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; printj }' } echo"Enteryourdate:" readinput InpuDays=$(date2days${input:0:4}${input:4:2}${input:6:2}) SysDays=$(date2days`date+"%Y%m%d"`) letresult=$InpuDays-$SysDays echo$result
#./test.sh Enteryourdate: 20110605 25
上个星期周一的日期
#!/bin/bash functiondate2days{ echo"$1$2$3"|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; printj }' } functiondays2date{ 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) }' } functiondate2week{ echo"$1$2$3"|awk'{ z=int((14-$2)/12);y=$1+4800-z;m=$2+12*z-3; dow=(int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472629)%7; printdow }' } year=`date+%Y`;month=`date+%m`;day=`date+%d` days=`date2days$year$month$day` week=`date2week$year$month$day` letdate=$days-$week-7 days2date$date