免费注册 查看新帖 |

Chinaunix

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

高手急救日期显示问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-05 16:04 |只看该作者 |倒序浏览
我定义riqi显示格示为当前时间 即     riqi=`date  +%Y%m%d`
最后显示格式为20070305,

我现在想显示昨天的日期,如何限制呀?
现在系统时间为20070305,我想在今天显示昨天的时间,格式为20070304,另外,还想问一下,如果实现了,能不能考虑到隔月问题,
即在20070301的前一天自动能显示20070228,

论坛徽章:
0
2 [报告]
发表于 2007-03-05 16:21 |只看该作者
riqi=`date -d "yesterday"  +%F`

论坛徽章:
0
3 [报告]
发表于 2007-03-05 16:36 |只看该作者
我用的是UNIX操作系统,报错呀~

TEST2:jxquery:/query/jx/tyw>riqi=`date -d "yesterday"  +%F`
date: Not a recognized flag: d
Usage: date [-u] [+"Field Descriptors"]

论坛徽章:
0
4 [报告]
发表于 2007-03-05 17:12 |只看该作者
....
linux的bash
[root@server3 data]# bash -version
bash -version
GNU bash, version 3.00.15(1)-release (i386-redhat-linux-gnu)
Copyright (C) 2004 Free Software Foundation, Inc.

论坛徽章:
0
5 [报告]
发表于 2007-03-05 17:15 |只看该作者
我用的UNIX操作系统,用的是ORACLE数据库,linux命令在unix不适用呀!

论坛徽章:
0
6 [报告]
发表于 2007-03-05 17:53 |只看该作者
date +%Y%m%d -d "-1 day"

论坛徽章:
0
7 [报告]
发表于 2007-03-05 19:29 |只看该作者
原帖由 ydtyw 于 2007-3-5 16:04 发表
我定义riqi显示格示为当前时间 即     riqi=`date  +%Y%m%d`
最后显示格式为20070305,

我现在想显示昨天的日期,如何限制呀?
现在系统时间为20070305,我想在今天显示昨天的时间,格式为20070304,另外,还想 ...


我们在项目中也遇到了这个问题。
我们也采用了两种方式,一种是用sqlplus的spool输出到文件中,sql是select sysdate-1 from dual;
这种方法最简单可靠,但是要依赖数据库;

另外一种方式是通过简本经过复杂运算,我采用后者,因为我不想依赖数据库,源码是



  1. #### 计算yesterday
  2. # 设置当前的年月日
  3. month=`date +%m`
  4. day=`date +%d`
  5. year=`date +%Y`

  6. # 把month转换成数值以便于下面的计算
  7. month=`expr $month + 0`

  8. # 日期减一,准备计算昨天的日期
  9. day=`expr $day - 1`

  10. # 如果日期是0,则计算前一月
  11. if [ $day -le 0 ]; then

  12.   # Find the preivous month.
  13.   month=`expr $month - 1`

  14.   # 如果month=0,则取上一年的12月31日
  15.   if [ $month -eq 0 ]; then
  16.     month=12
  17.     day=`expr $day + 31`
  18.     year=`expr $year - 1`

  19.   # 如果month!=0,则取上一个月的最后一天
  20.   else
  21.     case $month in
  22.       1|3|5|7|8|10|12) day=`expr $day + 31`;;
  23.       4|6|9|11) day=`expr $day + 30`;;
  24.       2)
  25.         if [ `expr $year % 4` -eq 0 ]; then
  26.           if [ `expr $year % 400` -eq 0 ]; then
  27.             day=`expr $day + 29`
  28.           elif [ `expr $year % 100` -eq 0 ]; then
  29.             day=`expr $day + 28`
  30.           else
  31.             day=`expr $day + 29`
  32.           fi
  33.         else
  34.           day=`expr $day + 28`
  35.         fi
  36.       ;;
  37.     esac
  38.   fi
  39. fi

  40. # 输出年月日
  41. if [ month -lt 10 ]
  42. then
  43.     month="0"$month
  44. fi

  45. if [ day -lt 10 ]
  46. then
  47.     day="0"$day
  48. fi

  49. yesterday=$year$month$day
复制代码

论坛徽章:
0
8 [报告]
发表于 2007-03-05 19:53 |只看该作者
这种讨论好像有无数次了!我也贴一个!
#!/bin/sh

####作者:RUIFOX
####功能:取得某日期的任意天前或后的日期

####参数1为?获得帮助

if [ "$1" = "?" ]
then
echo "功能:取得某日期的任意天前或后的日期
Usage:date_g [-b|-a] [n(days)] [Now(yyyymmdd)]
             -b 表示往前的日期
             -a 表示往后的日期,缺省为-a 1,即往后一天
              n 表示间隔的天数,缺省为1
            Now 表示基点日期,缺省为当前日期
如:date_g -a 365 20050210,结果为20060210"
        exit
fi

####参数2表示间隔天数,缺省为1天
Pre=1
if [ "$2" != "" ]
then
        Pre=$2
fi

####参数3表示基点日期,缺省为当前系统日期
####如果要输入特定的基点日期,参数2则不能省略
if [ "$3" != "" ]
then
        Len=`expr length "$3"`
        if [ $Len != 8 ]
        then
                echo "非法基点日期[$Len]!!"
                exit
        fi
        year=`echo $3|awk '{print substr($1,1,4)}'`
        month=`echo $3|awk '{print substr($1,5,2)}'`
        day=`echo $3|awk '{print substr($1,7,2)}'`
        DateP=$3
else
        month=`date +%m`
        day=`date +%d`
        year=`date +%Y`
        DateP=`date +'%Y%m%d'`
fi

####参数1表示向前或向后计数
if [ "$1" = "-a" ]
then
        day=`expr $day + $Pre`
        Ss="后"
else
        day=`expr $day - $Pre`
        Ss="前"
fi

####函数mon_max_day获得每个月的最大天数
####参数一:月数(1-12)
####输出:显示最大天数
mon_max_day()
{
day=0
if [ $1 -gt 0 -a $1 -lt 13 ]
then
case $1 in
            1|01|3|03|5|05|7|07|8|08|10|12) day=31;;
            4|04|6|06|9|09|11) day=30;;
            2|02)
                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
printf $day
}

####主程序开始
Max=`mon_max_day $month`

####针对向前的情况
while [ $day -le 0 ]
do
        month=`expr $month - 1`
        if [ $month -eq 0 ]
        then
            month=12
            year=`expr $year - 1`
        fi
        Max=`mon_max_day $month`
        day=`expr $day + $Max`
done

####针对向后的情况
while [ $day -gt $Max ]
do
        day=`expr $day - $Max`
        month=`expr $month + 1`
        if [ $month -eq 13 ]
        then
            month=1
            year=`expr $year + 1`
        fi
        Max=`mon_max_day $month`
done


DateA=`printf "%02s%02s%02d" $year $month $day`
#echo "基点日期为[$DateP],[$Pre]天$Ss的日期为[$DateA]"
echo "$DateA"
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP