免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2510 | 回复: 9
打印 上一主题 下一主题

请教一个办法可以算上一天日期 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-07-19 16:15 |只看该作者 |正序浏览
想用csh or bash写一个script 能算出上一天的日期。
有看过valentine 一个办法算上一天日期
offset=`echo $TZ | tr -d '[A-Z+]'`
new_offset=`expr $offset - 24 `
TZ=`echo $TZ | sed "s/[+-]\{0,1\}[1-9][0-9]\{0,1\}/$new_offset/` \
LogDate=`date +%y%m%d`
会出错,说认不出“expr",而且echo 出的$TZ是PRC.
不知道valentine是用的什么shell?

论坛徽章:
0
10 [报告]
发表于 2004-07-21 00:09 |只看该作者

请教一个办法可以算上一天日期

是GNU的date吗?
可以用:
  1. date +'%Y%m%d'  --date='1 day ago'
复制代码

论坛徽章:
0
9 [报告]
发表于 2004-07-20 23:30 |只看该作者

请教一个办法可以算上一天日期

原帖由 "nooby" 发表:
多谢risingsun的答复。
还想请教 最好你要把TZ的设置该回去了?
如何改?我的echo $TZ是PRC.


你写在一个SHELL里,运行完成后不影响主SHELL环境变量

论坛徽章:
0
8 [报告]
发表于 2004-07-19 20:09 |只看该作者

请教一个办法可以算上一天日期

For linux :
date -d'20 day ago' +%Y%m%d

论坛徽章:
0
7 [报告]
发表于 2004-07-19 19:50 |只看该作者

请教一个办法可以算上一天日期

原帖由 "nooby" 发表:
Sorry, 能说的详细点嘛,如何改$ZT?
另外我的系统是Solaris8.0
再次感谢!

如下是一个例子:
#!/bin/sh

yy=`date +%Y` #Year yyyy
mm=`date +%m` #Month mm
dd=`date +%d` #Day dd

if [ $dd = "01" ] #如果为月初则计算上月末的日期
then
mm=`expr $mm - 1 ` #lm 上月
if [ $mm -eq 0 ]
then mm=12
fi
case $mm 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
echo "yesterday is $yy-$mm-$Yesterday"

论坛徽章:
0
6 [报告]
发表于 2004-07-19 17:24 |只看该作者

请教一个办法可以算上一天日期

Sorry, 能说的详细点嘛,如何改$ZT?
另外我的系统是Solaris8.0
再次感谢!

论坛徽章:
0
5 [报告]
发表于 2004-07-19 17:15 |只看该作者

请教一个办法可以算上一天日期

原帖由 "nooby" 发表:
多谢risingsun的答复。
还想请教 最好你要把TZ的设置该回去了?
如何改?我的echo $TZ是PRC.

改之前先保存$TZ,算完了之后用保存的重新设一下就OK了。

论坛徽章:
0
4 [报告]
发表于 2004-07-19 17:09 |只看该作者

请教一个办法可以算上一天日期

多谢risingsun的答复。
还想请教 最好你要把TZ的设置该回去了?
如何改?我的echo $TZ是PRC.

论坛徽章:
0
3 [报告]
发表于 2004-07-19 16:53 |只看该作者

请教一个办法可以算上一天日期

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

论坛徽章:
0
2 [报告]
发表于 2004-07-19 16:32 |只看该作者

请教一个办法可以算上一天日期

date -d "1 day ago"???
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP