When you encounter a system where the date command is not powerful, you can try these few functions.
#Date to days
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'`
Copy code
#Days to date
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
Copy code
#Date to minute
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'`
Copy code
#Minute to date
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
Copy code
#Date to seconds
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'`
Copy code
#Seconds to date
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
Copy code
#Date to millisecond
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'`
Copy code
#Ms to date
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
Copy code
Applications:
Calculate today's date after N days
- #!/bin/bash
- function date2days {
- 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;
- print j
- }'
- }
-
- 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)
- }'
- }
-
- year=`date +%Y`; month=`date +%m`; day=`date +%d`
- days=`date2days $year $month $day`
- N=5
- let days-=$N
- days2date $days
Calculate the date after N days of a day
#!/bin/bash function date2days { 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; print j }' } 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) }' } year=2010; month=01; day=20 days=`date2days $year $month $day` let days+=5 days2date $days
Calculate all dates of the previous week
- #!/bin/bash
- function date2days {
- 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;
- print j
- }'
- }
-
- 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)
- }'
- }
-
- function date2week {
- 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;
- print dow
- }'
- }
-
- year=`date +%Y`; month=`date +%m`; day=`date +%d`
- days=`date2days $year $month $day`
- week=`date2week $year $month $day`
- let dateEnd=$days-$week-1
- let dateBegin=$dateEnd-6
- for ((i=$dateBegin;i<=$dateEnd;i++)); do
- days2date $i
- done
Convert date time to milliseconds
- 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
- print j$7
- }'
- }
-
- date2milliseconds `echo "2010-08-18 18:59:19.073" | /usr/xpg4/bin/awk -F'[:.-]+' '$1=$1'`
Convert date and time to seconds
- 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-07-21 00:00:00" | sed 's/-/ /g;s/:/ /g'`
Determine if a number is a legal 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
- }'
- }
-
- 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)
- }'
- }
-
- 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 "$num1 is valid date" || echo "$num1 is invalid date"
- [ "$num2" -eq "$date2" ] && echo "$num2 is valid date" || echo "$num2 is invalid date"
Calculate the time before 10 minutes
- 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
- }'
- }
- 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)
- }'
- }
-
- now=`date "+%Y-%m-%d %H:%M" | sed 's/-/ /g;s/:/ /g'`
- minutes=`date2minutes $now`
- let minutes-=10
- minutes2date $minutes
Calculate the number of days between the specified date and the current system date
- #!/bin/bash
- 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
- }'
- }
-
- echo "Enter your date:"
- read input
- InpuDays=$(date2days ${input:0:4} ${input:4:2} ${input:6:2})
- SysDays=$(date2days `date +"%Y %m %d"`)
- let result=$InpuDays-$SysDays
- echo $result
Monday's date last week
- #!/bin/bash
- function date2days {
- 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;
- print j
- }'
- }
-
- 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)
- }'
- }
-
- function date2week {
- 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;
- print dow
- }'
- }
-
- year=`date +%Y`; month=`date +%m`; day=`date +%d`
- days=`date2days $year $month $day`
- week=`date2week $year $month $day`
- let date=$days-$week-7
- days2date $date