登陆

sh获得前一天的日期

  neo:

如果是linux上的date,直接用

date -d yesterday

date -d yesterday +%Y%m%d

另外如

date -d '3 days ago'

date -d tomorrow

date -d '3 days'

如果不是gnu/linux上的date命令,请往下看

----------------------------------------------------------------

好象有date 有-24 有+%y%m%d等,谢了。

还有有办法获得3天前的日期吗?

唉,在b shell没有这个用法了,要想用纯shell做几天前后的运算,只有自己想办法了,+%y%m%d用于控制输出格式,作用有限,要想做的话,参见这个帖子大家的发言:

我的确在哪儿看到用一条命令就可以取昨天或明天的日期,

参数中有-24或+24。没那么复杂

好象用到了参数TZ=-24;export TZ什么的

改变时区,应该可以实现,确实是个好方法。

不会吧,你说的俺都明白了,你自己还不懂?

date命令的显示是与环境变量TZ有关的

看以下的命令操作,你应该便明白了,

$#看当前时区

$echo $TZ

CST-8

$#显示当前时间

$date

Mon Apr 2 15:48:36 CST 2002

$#改变当前时区,

TZ=CST+16;export TZ

$#显示当前时间(中间未改变系统时间,但date命令的显示已为昨天)

Mon Apr 1 15:48:33 CST 2002

#!/bin/sh

# ydate: A Bourne shell script that

# prints yestarday's date

# Output form: Month Day Year

# From Focus on Unix: http://unix.about.com

# Set the current month day and year.

month=`date +%m`

day=`date +%d`

year=`date +%Y`

# Add 0 to month. This is a

# trick to make month an unpadded integer.

month=`expr $month + 0`

# Subtract one from the current day.

day=`expr $day - 1`

# If the day is 0 then determine the last

# day of the previous month.

if [ $day -eq 0 ]; then

# Find the preivous month.

month=`expr $month - 1`

# If the month is 0 then it is Dec 31 of

# the previous year.

if [ $month -eq 0 ]; then

month=12

day=31

year=`expr $year - 1`

# If the month is not zero we need to find

# the last day of the month.

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

# Print the month day and year.

echo $month $day $year

exit 0

时区转换实在是太精妙了!:-)

如果在shell中改了时区,执行完后,系统真正的时区还是正确的吗?

回楼上:最好你要把TZ的设置该回去了。

不过我在实践中用的方法是:

如果你的主机能够连接到数据库的话,比如可以连接到SYBASE数据库,那就可以利用数据库里面计算时间的丰富的函数了,比如

dateadd(day,getdate(),-1)

就能得到最天的日期了

因为这个贴子被版主盖过章,所以在此跟一下。

最近经常看到有网友关于相对日期问题的贴子,这在shell下进行解决时比较头疼。现将我作的几个程序贴出来与大家分享。虽然是用c写的,把它们贴在这里,我想大家也不会太反对的。其中一个程序以前发表在sco版下,现在早已淹没在汪洋大海中了,无从查找。

因为是早先刚学c时的作品,且英文又不行,故写出的程序比较难看,请大家别见笑。

相关链接:

date=`expr `date +%m%d` - 1`

这儿有一个我写的计算昨天的函数,可能是纯shell中唯一的简单解决方案吧,要想将其应用在计算任意天前后,恐怕还是不太方便的,看看,能否满足?

yesterday ()

{

_year=$1;_month=$2;_day=$3

if [ $_day -eq 1 ];then

if [ $_month -eq 1 ];then

_year=`expr $_year - 1`

_month=12

else

_month=`expr $_month - 1`

fi

_day=`echo `cal $_month $_year`|awk '{print $NF}'`

else

_day=`expr $_day - 1`

fi

echo "$_year $_month $_day"|awk '{if (length($2)==1) $2=0$2;if (length($3)==1) $3=0$3;print $1,$2,$3}'

}

unix 我没有试过,linux上可以用

date --date "1 days ago"

yy=`date +%Y` #Year yyyy

mm=`date +%m` #Month mm

dd=`date +%d` #Day dd

if [ $dd = "01" ] #如果为月初则计算上月末的日期

then

lm=`expr $mm - 1 ` #lm 上月

if [ $lm -eq 0 ]

then lm=12

fi

case $Fm in

1|3|5|7|8|10|12) Yesterday=31 ;;

4|6|9|11) Yesterday=30 ;;

2) #计算闰月

if [ ` expr $yy % 4 ` -eq 0 -a `expr $yy % 100 ` -ne 0 -o ` expr $yy % 400 ` -eq 0 ]

then Yesterday=29

else Yesterday=28

fi ;;

esac

else #如果不是月初的处理

Yesterday=`expr $dd - 1 `

if [ $Yesterday -lt 10 ] ###上旬日期处理

then Yesterday=0$Yesterday

fi

fi

结果: today=20020301 yesterday=28

« 上一篇 | 下一篇 »