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