unix取日期的问题

时间:2022-10-19 16:13:31
系统是 HP UNIX
想在一个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 
}

#6


如果有oracle数据库可以用select sysdate-1 from dual来实现,oracle数据库内部可以处理闰年闰月的各种情况

#7


http://www.hickwu.com/?p=269

#8


引用 4 楼 cceczjxy 的回复:
date "-d -1 day"

这样用呢?

这命令在linux下非常好用
不过在一些unix系统上不好用

#9


引用 8 楼 steptodream 的回复:
引用 4 楼 cceczjxy 的回复:

date "-d -1 day"

这样用呢?

这命令在linux下非常好用
不过在一些unix系统上不好用



只用过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

#11


引用 10 楼 cceczjxy 的回复:
查了以前在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|……


这些 代码 要存放在一个.sh文件里,直接执行就可以了么?
刚接触unix,不大会用

#12


get_before_date 20100428这行改成 
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]"

#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 
}

#6


如果有oracle数据库可以用select sysdate-1 from dual来实现,oracle数据库内部可以处理闰年闰月的各种情况

#7


http://www.hickwu.com/?p=269

#8


引用 4 楼 cceczjxy 的回复:
date "-d -1 day"

这样用呢?

这命令在linux下非常好用
不过在一些unix系统上不好用

#9


引用 8 楼 steptodream 的回复:
引用 4 楼 cceczjxy 的回复:

date "-d -1 day"

这样用呢?

这命令在linux下非常好用
不过在一些unix系统上不好用



只用过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

#11


引用 10 楼 cceczjxy 的回复:
查了以前在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|……


这些 代码 要存放在一个.sh文件里,直接执行就可以了么?
刚接触unix,不大会用

#12


get_before_date 20100428这行改成 
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]"