当前位置:Linux教程 - Shell - shell - 用date获得前一天的日期

shell - 用date获得前一天的日期

用date获得前一天的日期
2004-04-23 15:18 pm
来自:Linux文档
现载:Www.8s8s.coM
地址:无名

好象有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