想在一个shell中取昨天的日期该如何取?
发现 date -d 不可用
提示下面的错误
[vtest:/home/test] date -d
date: illegal option -- d
Usage: date [-u] [+format]
date [-u] [mmddhhmm[[cc]yy]]
date [-a [-]sss.fff]
还有什么办法可以取得昨天的日期么?
14 个解决方案
#1
自己写一个很简单的c程序吧
#2
1 #include<stdio.h>
2 #include<time.h>
3
4 int main(){
5
6 time_t t;
7 char buf[30],*p;
8 time(&t);
9 t -= 24*60*60;
10
11 sprintf(buf,"%s",ctime(&t));
12 printf("yesterday is:%s");
13
14 p = buf+4;
15 while(p < buf+10)
16 printf("%c",*p++);
17 printf("\n");
18 return 0;
19 }
#3
取昨天的日期用getanyday -1就可以了。
getanyday()
{
perl -e '
use Time::Local;
use Time::localtime;
$tm = localtime();
$tick = timelocal($tm->sec, $tm->min, $tm->hour, $tm->mday, $tm->mon, $tm->year);
$tick += 60 * 60 * 24 * "'$1'";
$tm = localtime($tick);
printf("%04d%02d%02d\n", $tm->year+1900, $tm->mon+1, $tm->mday);
'
}
#4
date "-d -1 day"
这样用呢?
这样用呢?
#5
比较复杂,需要判断闰年,每月天数等。
getpastday() {
month=`date +%m`
day=`date +%d`
year=`date +%Y`
month=`expr $month + 0`
day=`expr $day - 1`
if [ $day -eq 0 ]; then
month=`expr $month - 1`
if [ $month -eq 0 ]; then
month=12
day=`expr 31 + $day`
year=`expr $year - 1`
else
case $month in
1|3|5|7|8|10|12) day=31;;
4|6|9|11) day=30;;
2)
if [ `expr $year % 4` -eq 0 ]; then
if [ `expr $year % 400` -eq 0 ]; then
day=29
elif [ `expr $year % 100` -eq 0 ]; then
day=28
else
day=29
fi
else
day=28
fi
;;
esac
fi
fi
day=`expr $day - 1`
if [ $day -eq 0 ]; then
month=`expr $month - 1`
if [ $month -eq 0 ]; then
month=12
day=`expr 31 + $day`
year=`expr $year - 1`
else
case $month in
1|3|5|7|8|10|12) day=31;;
4|6|9|11) day=30;;
2)
if [ `expr $year % 4` -eq 0 ]; then
if [ `expr $year % 400` -eq 0 ]; then
day=29
elif [ `expr $year % 100` -eq 0 ]; then
day=28
else
day=29
fi
else
day=28
fi
;;
esac
fi
fi
if [ $month -lt 10 ]; then
month=0$month
fi
if [ $day -lt 10 ]; then
day=0$day
fi
pastday=$year$month$day
return
}
getpastday() {
month=`date +%m`
day=`date +%d`
year=`date +%Y`
month=`expr $month + 0`
day=`expr $day - 1`
if [ $day -eq 0 ]; then
month=`expr $month - 1`
if [ $month -eq 0 ]; then
month=12
day=`expr 31 + $day`
year=`expr $year - 1`
else
case $month in
1|3|5|7|8|10|12) day=31;;
4|6|9|11) day=30;;
2)
if [ `expr $year % 4` -eq 0 ]; then
if [ `expr $year % 400` -eq 0 ]; then
day=29
elif [ `expr $year % 100` -eq 0 ]; then
day=28
else
day=29
fi
else
day=28
fi
;;
esac
fi
fi
day=`expr $day - 1`
if [ $day -eq 0 ]; then
month=`expr $month - 1`
if [ $month -eq 0 ]; then
month=12
day=`expr 31 + $day`
year=`expr $year - 1`
else
case $month in
1|3|5|7|8|10|12) day=31;;
4|6|9|11) day=30;;
2)
if [ `expr $year % 4` -eq 0 ]; then
if [ `expr $year % 400` -eq 0 ]; then
day=29
elif [ `expr $year % 100` -eq 0 ]; then
day=28
else
day=29
fi
else
day=28
fi
;;
esac
fi
fi
if [ $month -lt 10 ]; then
month=0$month
fi
if [ $day -lt 10 ]; then
day=0$day
fi
pastday=$year$month$day
return
}
#6
如果有oracle数据库可以用select sysdate-1 from dual来实现,oracle数据库内部可以处理闰年闰月的各种情况
#7
http://www.hickwu.com/?p=269
#8
这命令在linux下非常好用
不过在一些unix系统上不好用
#9
只用过hp-unix,不过没用过这些命令试过,受教了。
#10
查了以前在hp-unix下写的东西,正好有一个取指定日期上一日日期的脚本
get_mon_days()
{
Y=`expr substr $1 1 4`
M=`expr substr $1 5 2`
r1=`expr $Y \% 4`
r2=`expr $Y \% 100`
r3=`expr $Y \% 400`
case $M in
01|03|05|07|08|10|12) days=31;;
04|06|09|11) days=30;;
esac
if [ $M -eq 02 ]
then
if [ r1 -eq 0 -a r2 -ne 0 -o r3 -eq 0 ]
then
days=29
else
days=28
fi
fi
echo $days
}
get_before_date()
{
Y=`expr substr $1 1 4`
M=`expr substr $1 5 2`
D=`expr substr $1 7 2`
YY=`expr $Y - 1`
MM=`expr $M - 1`
DD=`expr $D - 1`
MM=`printf "%02d" $MM`
DD=`printf "%02d" $DD`
dd=$Y$MM
dad=`get_mon_days $dd`
be_date=$Y$M$DD
if [ $D -eq 01 ]
then
if [ $M -ne 01 ]
then
be_date=$Y$MM$dad
fi
if [ $M -eq 01 ]
then
be_date=$YY"1231"
fi
fi
echo $be_date
}
get_before_date 20100428
get_mon_days()
{
Y=`expr substr $1 1 4`
M=`expr substr $1 5 2`
r1=`expr $Y \% 4`
r2=`expr $Y \% 100`
r3=`expr $Y \% 400`
case $M in
01|03|05|07|08|10|12) days=31;;
04|06|09|11) days=30;;
esac
if [ $M -eq 02 ]
then
if [ r1 -eq 0 -a r2 -ne 0 -o r3 -eq 0 ]
then
days=29
else
days=28
fi
fi
echo $days
}
get_before_date()
{
Y=`expr substr $1 1 4`
M=`expr substr $1 5 2`
D=`expr substr $1 7 2`
YY=`expr $Y - 1`
MM=`expr $M - 1`
DD=`expr $D - 1`
MM=`printf "%02d" $MM`
DD=`printf "%02d" $DD`
dd=$Y$MM
dad=`get_mon_days $dd`
be_date=$Y$M$DD
if [ $D -eq 01 ]
then
if [ $M -ne 01 ]
then
be_date=$Y$MM$dad
fi
if [ $M -eq 01 ]
then
be_date=$YY"1231"
fi
fi
echo $be_date
}
get_before_date 20100428
#11
这些 代码 要存放在一个.sh文件里,直接执行就可以了么?
刚接触unix,不大会用
#12
get_before_date 20100428这行改成
get_before_date $1
把所有的存到一个脚本里边,就可以执行了
get_before_date $1
把所有的存到一个脚本里边,就可以执行了
#13
date --date='1 day ago'
#14
linux下
前一天的日期
date -d"1 day ago" +"%y%m%d"
前一个月的日期
date -d"1 month ago" +"%y%m%d"
类似的还有
date -d"-1 day ago 1 month ago" +"%y%m%d"
date -d"1 day ago -1 year ago 1 month ago" +"%y%m%d"
freebsd下
前一天的日期
date -v-1d +"%y%m%d"
前一个月的日期
date -v-md +"%y%m%d"
类似的还有
date -v-1d -v-1m +"%y%m%d"
date -v-1d -v-1m -v-1y +"%y%m%d"
hpux下
perl -e "print sprintf '%04d-%02d-%02d',(localtime(time()-86400))[5]+1900,(localtime(time()-86400))[4]+1,(localtime(time()-86400))[3]"
前一天的日期
date -d"1 day ago" +"%y%m%d"
前一个月的日期
date -d"1 month ago" +"%y%m%d"
类似的还有
date -d"-1 day ago 1 month ago" +"%y%m%d"
date -d"1 day ago -1 year ago 1 month ago" +"%y%m%d"
freebsd下
前一天的日期
date -v-1d +"%y%m%d"
前一个月的日期
date -v-md +"%y%m%d"
类似的还有
date -v-1d -v-1m +"%y%m%d"
date -v-1d -v-1m -v-1y +"%y%m%d"
hpux下
perl -e "print sprintf '%04d-%02d-%02d',(localtime(time()-86400))[5]+1900,(localtime(time()-86400))[4]+1,(localtime(time()-86400))[3]"
#1
自己写一个很简单的c程序吧
#2
1 #include<stdio.h>
2 #include<time.h>
3
4 int main(){
5
6 time_t t;
7 char buf[30],*p;
8 time(&t);
9 t -= 24*60*60;
10
11 sprintf(buf,"%s",ctime(&t));
12 printf("yesterday is:%s");
13
14 p = buf+4;
15 while(p < buf+10)
16 printf("%c",*p++);
17 printf("\n");
18 return 0;
19 }
#3
取昨天的日期用getanyday -1就可以了。
getanyday()
{
perl -e '
use Time::Local;
use Time::localtime;
$tm = localtime();
$tick = timelocal($tm->sec, $tm->min, $tm->hour, $tm->mday, $tm->mon, $tm->year);
$tick += 60 * 60 * 24 * "'$1'";
$tm = localtime($tick);
printf("%04d%02d%02d\n", $tm->year+1900, $tm->mon+1, $tm->mday);
'
}
#4
date "-d -1 day"
这样用呢?
这样用呢?
#5
比较复杂,需要判断闰年,每月天数等。
getpastday() {
month=`date +%m`
day=`date +%d`
year=`date +%Y`
month=`expr $month + 0`
day=`expr $day - 1`
if [ $day -eq 0 ]; then
month=`expr $month - 1`
if [ $month -eq 0 ]; then
month=12
day=`expr 31 + $day`
year=`expr $year - 1`
else
case $month in
1|3|5|7|8|10|12) day=31;;
4|6|9|11) day=30;;
2)
if [ `expr $year % 4` -eq 0 ]; then
if [ `expr $year % 400` -eq 0 ]; then
day=29
elif [ `expr $year % 100` -eq 0 ]; then
day=28
else
day=29
fi
else
day=28
fi
;;
esac
fi
fi
day=`expr $day - 1`
if [ $day -eq 0 ]; then
month=`expr $month - 1`
if [ $month -eq 0 ]; then
month=12
day=`expr 31 + $day`
year=`expr $year - 1`
else
case $month in
1|3|5|7|8|10|12) day=31;;
4|6|9|11) day=30;;
2)
if [ `expr $year % 4` -eq 0 ]; then
if [ `expr $year % 400` -eq 0 ]; then
day=29
elif [ `expr $year % 100` -eq 0 ]; then
day=28
else
day=29
fi
else
day=28
fi
;;
esac
fi
fi
if [ $month -lt 10 ]; then
month=0$month
fi
if [ $day -lt 10 ]; then
day=0$day
fi
pastday=$year$month$day
return
}
getpastday() {
month=`date +%m`
day=`date +%d`
year=`date +%Y`
month=`expr $month + 0`
day=`expr $day - 1`
if [ $day -eq 0 ]; then
month=`expr $month - 1`
if [ $month -eq 0 ]; then
month=12
day=`expr 31 + $day`
year=`expr $year - 1`
else
case $month in
1|3|5|7|8|10|12) day=31;;
4|6|9|11) day=30;;
2)
if [ `expr $year % 4` -eq 0 ]; then
if [ `expr $year % 400` -eq 0 ]; then
day=29
elif [ `expr $year % 100` -eq 0 ]; then
day=28
else
day=29
fi
else
day=28
fi
;;
esac
fi
fi
day=`expr $day - 1`
if [ $day -eq 0 ]; then
month=`expr $month - 1`
if [ $month -eq 0 ]; then
month=12
day=`expr 31 + $day`
year=`expr $year - 1`
else
case $month in
1|3|5|7|8|10|12) day=31;;
4|6|9|11) day=30;;
2)
if [ `expr $year % 4` -eq 0 ]; then
if [ `expr $year % 400` -eq 0 ]; then
day=29
elif [ `expr $year % 100` -eq 0 ]; then
day=28
else
day=29
fi
else
day=28
fi
;;
esac
fi
fi
if [ $month -lt 10 ]; then
month=0$month
fi
if [ $day -lt 10 ]; then
day=0$day
fi
pastday=$year$month$day
return
}
#6
如果有oracle数据库可以用select sysdate-1 from dual来实现,oracle数据库内部可以处理闰年闰月的各种情况
#7
http://www.hickwu.com/?p=269
#8
这命令在linux下非常好用
不过在一些unix系统上不好用
#9
只用过hp-unix,不过没用过这些命令试过,受教了。
#10
查了以前在hp-unix下写的东西,正好有一个取指定日期上一日日期的脚本
get_mon_days()
{
Y=`expr substr $1 1 4`
M=`expr substr $1 5 2`
r1=`expr $Y \% 4`
r2=`expr $Y \% 100`
r3=`expr $Y \% 400`
case $M in
01|03|05|07|08|10|12) days=31;;
04|06|09|11) days=30;;
esac
if [ $M -eq 02 ]
then
if [ r1 -eq 0 -a r2 -ne 0 -o r3 -eq 0 ]
then
days=29
else
days=28
fi
fi
echo $days
}
get_before_date()
{
Y=`expr substr $1 1 4`
M=`expr substr $1 5 2`
D=`expr substr $1 7 2`
YY=`expr $Y - 1`
MM=`expr $M - 1`
DD=`expr $D - 1`
MM=`printf "%02d" $MM`
DD=`printf "%02d" $DD`
dd=$Y$MM
dad=`get_mon_days $dd`
be_date=$Y$M$DD
if [ $D -eq 01 ]
then
if [ $M -ne 01 ]
then
be_date=$Y$MM$dad
fi
if [ $M -eq 01 ]
then
be_date=$YY"1231"
fi
fi
echo $be_date
}
get_before_date 20100428
get_mon_days()
{
Y=`expr substr $1 1 4`
M=`expr substr $1 5 2`
r1=`expr $Y \% 4`
r2=`expr $Y \% 100`
r3=`expr $Y \% 400`
case $M in
01|03|05|07|08|10|12) days=31;;
04|06|09|11) days=30;;
esac
if [ $M -eq 02 ]
then
if [ r1 -eq 0 -a r2 -ne 0 -o r3 -eq 0 ]
then
days=29
else
days=28
fi
fi
echo $days
}
get_before_date()
{
Y=`expr substr $1 1 4`
M=`expr substr $1 5 2`
D=`expr substr $1 7 2`
YY=`expr $Y - 1`
MM=`expr $M - 1`
DD=`expr $D - 1`
MM=`printf "%02d" $MM`
DD=`printf "%02d" $DD`
dd=$Y$MM
dad=`get_mon_days $dd`
be_date=$Y$M$DD
if [ $D -eq 01 ]
then
if [ $M -ne 01 ]
then
be_date=$Y$MM$dad
fi
if [ $M -eq 01 ]
then
be_date=$YY"1231"
fi
fi
echo $be_date
}
get_before_date 20100428
#11
这些 代码 要存放在一个.sh文件里,直接执行就可以了么?
刚接触unix,不大会用
#12
get_before_date 20100428这行改成
get_before_date $1
把所有的存到一个脚本里边,就可以执行了
get_before_date $1
把所有的存到一个脚本里边,就可以执行了
#13
date --date='1 day ago'
#14
linux下
前一天的日期
date -d"1 day ago" +"%y%m%d"
前一个月的日期
date -d"1 month ago" +"%y%m%d"
类似的还有
date -d"-1 day ago 1 month ago" +"%y%m%d"
date -d"1 day ago -1 year ago 1 month ago" +"%y%m%d"
freebsd下
前一天的日期
date -v-1d +"%y%m%d"
前一个月的日期
date -v-md +"%y%m%d"
类似的还有
date -v-1d -v-1m +"%y%m%d"
date -v-1d -v-1m -v-1y +"%y%m%d"
hpux下
perl -e "print sprintf '%04d-%02d-%02d',(localtime(time()-86400))[5]+1900,(localtime(time()-86400))[4]+1,(localtime(time()-86400))[3]"
前一天的日期
date -d"1 day ago" +"%y%m%d"
前一个月的日期
date -d"1 month ago" +"%y%m%d"
类似的还有
date -d"-1 day ago 1 month ago" +"%y%m%d"
date -d"1 day ago -1 year ago 1 month ago" +"%y%m%d"
freebsd下
前一天的日期
date -v-1d +"%y%m%d"
前一个月的日期
date -v-md +"%y%m%d"
类似的还有
date -v-1d -v-1m +"%y%m%d"
date -v-1d -v-1m -v-1y +"%y%m%d"
hpux下
perl -e "print sprintf '%04d-%02d-%02d',(localtime(time()-86400))[5]+1900,(localtime(time()-86400))[4]+1,(localtime(time()-86400))[3]"