Chinaunix

标题: 求N分钟之前的时间改进版,欢迎继续拍砖 [打印本页]

作者: hail    时间: 2007-09-05 10:02
标题: 求N分钟之前的时间改进版,欢迎继续拍砖
#!/usr/bin/sh
#set -x
ago_day()
{
str=$1
days=$2
yy=`echo $str|cut -c 1-4`
mm=`echo $str|cut -c 5-6`
dd=`echo $str|cut -c 7-8`
sav_dd=$days
days=`expr $days - $dd`
while [ $days -ge 0 ]
do
        mm=`expr $mm - 1`
        [ $mm -eq 0 ] && mm=12 && yy=`expr $yy - 1`
        aaa=`cal $mm $yy`
        bbb=`echo $aaa|awk '{print $NF}'`
        days=`expr $days - $bbb`
done
dd=`expr 0 - $days`
expr $dd : "^.$" > /dev/null && dd=0$dd
expr $mm : "^.$" > /dev/null && mm=0$mm
echo $yy$mm$dd
}
Change_time=${1:-120} #120分钟即2小时之前
V_Day=`date +%Y%m%d`
V_Hour=`date +%H`
V_Min=`date +%M`
V_Time=`expr $V_Hour \* 60 + $V_Min `
if [ $V_Time -lt $Change_time ];
then
   Day=`expr $Change_time / 1440 `
   V_Day=`ago_day $V_Day $Day`
   while [ $V_Time -le $Change_time ]
   do   
     V_Time=`expr 1440 + $V_Time`  
   done                     
fi
V_Time=`expr $V_Time - $Change_time `
N_Hour=`expr $V_Time / 60 `
N_Hour=`printf "%02d\n" $N_Hour`
N_Min=`expr $V_Time % 60 `
N_Min=`printf "%02d\n" $N_Min`

echo "the $Change_time minute ago is $V_Day $N_HourN_Min "


[ 本帖最后由 hail 于 2007-9-6 11:03 编辑 ]
作者: ly5066113    时间: 2007-09-05 11:11
恩,AIX测试通过。
Change_time=${1:-120}
做了个小小的改动,感觉会更方便点。
作者: ly5066113    时间: 2007-09-05 11:19
$ cat test.sh
#!/bin/sh
#set -x
Change_time=${1:-120} #默认120分钟即2小时之前
V_Day=`date +%m%d`
V_Hour=`date +%H`
V_Min=`date +%M`
V_Time=`expr $V_Hour \* 60 + $V_Min `
if [ $V_Time -lt $Change_time ];
then
   V_Time=` expr 24 \* 60 + $V_Time `
   OS=`uname`                                                                     
   if [ $OS = AIX ];                                                                  
   then                                                                                
       V_TZ=`echo $TZ|sed 's/.*\(..\)/\1/'`                                            
       V_TZ=`expr $V_TZ + 24`                                                         
       eval V_TZ=`echo $TZ|sed 's/..$/+$V_TZ/'`                                       
       TZ=$V_TZ                                                                        
       export TZ                                                                       
   elif [ $OS = SunOS ];                                                               
   then                                                                                
      TZ="GMT+16"                                                                     
      export TZ                                                                        
   fi                                                                                 
   V_Day=`date +%m%d`                             
fi

V_Time=`expr $V_Time - $Change_time `
N_Hour=`expr $V_Time / 60 `
N_Min=`expr $V_Time % 60 `

echo "the $Change_time minute ago is $V_Day $N_HourN_Min "
$ test.sh 10
the 10 minute ago is 0905 11:7
$ test.sh 100
the 100 minute ago is 0905 9:37
$ test.sh 1000
the 1000 minute ago is 0904 18:37
$ test.sh 10000
the 10000 minute ago is 0904 -131:-23
$

发现BUG!
作者: mxbao    时间: 2007-09-05 14:46
为什么我的执行$TZ没有显示呢....
as4的bash执行的
作者: doctorjxd    时间: 2007-09-05 15:16
这个问题已经被问过多次,实在没有必要写这么复杂的脚本来实现。

在FreeBSD下可以这样实现

  1. #!/bin/sh
  2. Change_time=${1:-120}
  3. date -j -f %s $(($(date "+%s")-$Change_time*60)) "+the $Change_time minutes ago is %m%d %H:%M"

复制代码

作者: hail    时间: 2007-09-05 16:11
原帖由 doctorjxd 于 2007-9-5 15:16 发表
这个问题已经被问过多次,实在没有必要写这么复杂的脚本来实现。

在FreeBSD下可以这样实现

#!/bin/sh
Change_time=${1:-120}
date -j -f %s $(($(date "+%s")-$Change_time*60)) "+the $Change_time mi ...



你没有用过solaris和aix吧

[ 本帖最后由 hail 于 2007-9-5 16:41 编辑 ]
作者: hail    时间: 2007-09-05 16:13
原帖由 ly5066113 于 2007-9-5 11:19 发表
$ cat test.sh
#!/bin/sh
#set -x
Change_time=${1:-120} #默认120分钟即2小时之前
V_Day=`date +%m%d`
V_Hour=`date +%H`
V_Min=`date +%M`
V_Time=`expr $V_Hour \* 60 + $V_Min `
if [ $V_Time -lt  ...


不会吧,你需要求10000 minute 之前???
作者: hail    时间: 2007-09-05 16:16
原帖由 mxbao 于 2007-9-5 14:46 发表
为什么我的执行$TZ没有显示呢....
as4的bash执行的


linux下的date不同,可以直接date -d …………什么的参数就可以求出前一天,前多少分钟…………,比较方便
solaris和aix下的date没有这个参数
作者: doctorjxd    时间: 2007-09-05 16:50
原帖由 hail 于 2007-9-5 16:11 发表



你没有用过solaris和aix吧

确实没用过。
不过求日期的那个功能即使用C语言实现,也比你写的那个脚本简单。
作者: hail    时间: 2007-09-05 17:08
原帖由 doctorjxd 于 2007-9-5 16:50 发表

确实没用过。
不过求日期的那个功能即使用C语言实现,也比你写的那个脚本简单。


为了这个你还写c代码,还编译一次!
再说不会C怎么办
作者: doctorjxd    时间: 2007-09-05 17:26
唉,很难么? 非要手工计算吗?

在solaris和aix编译C语言一行命令就搞定吧,还是内建的编译器。


  1. #include <limits.h>
  2. #include <time.h>
  3. #include <stdio.h>

  4. int main(int argc, char** argv)
  5. {
  6.   int Change_time=120;
  7.   if(argc==2)
  8.     Change_time=strtol(argv[1],NULL,10);

  9.   char buf[12];
  10.   time_t t=time(NULL)-Change_time*60;
  11.   struct tm* m=localtime(&t);
  12.   strftime(buf,11,"%m%d %H:%M",m);
  13.   
  14.   printf("The %d minutes ago is %s\n",Change_time,buf);
  15.   return 0;
  16. };

复制代码

[ 本帖最后由 doctorjxd 于 2007-9-5 17:30 编辑 ]
作者: doctorjxd    时间: 2007-09-05 17:28
IRIX我倒是在超算中心接触过。
编译C语言程序也很简单呀
作者: hail    时间: 2007-09-05 17:35
原帖由 doctorjxd 于 2007-9-5 17:28 发表
IRIX我倒是在超算中心接触过。
编译C语言程序也很简单呀


AIX下的官方C编译器是要钱的
aix和solaris默认都是没有带c编译器的。
除了自己安装gcc
作者: doctorjxd    时间: 2007-09-05 17:44
原帖由 hail 于 2007-9-5 17:35 发表


AIX下的官方C编译器是要钱的
aix和solaris默认都是没有带c编译器的。
除了自己安装gcc


原来如此。
看来我是免费的用习惯了。
还是比较喜欢FreeBSD。
作者: hail    时间: 2007-09-06 10:54
改进版,欢迎继续拍砖
#!/usr/bin/sh
#set -x
ago_day()
{
str=$1
days=$2
yy=`echo $str|cut -c 1-4`
mm=`echo $str|cut -c 5-6`
dd=`echo $str|cut -c 7-8`
sav_dd=$days
days=`expr $days - $dd`
while [ $days -ge 0 ]
do
        mm=`expr $mm - 1`
        [ $mm -eq 0 ] && mm=12 && yy=`expr $yy - 1`
        aaa=`cal $mm $yy`
        bbb=`echo $aaa|awk '{print $NF}'`
        days=`expr $days - $bbb`
done
dd=`expr 0 - $days`
expr $dd : "^.$" > /dev/null && dd=0$dd
expr $mm : "^.$" > /dev/null && mm=0$mm
echo $yy$mm$dd
}
Change_time=${1:-120} #120分钟即2小时之前
V_Day=`date +%Y%m%d`
V_Hour=`date +%H`
V_Min=`date +%M`
V_Time=`expr $V_Hour \* 60 + $V_Min `
if [ $V_Time -lt $Change_time ];
then
   Day=`expr $Change_time / 1440 `
   V_Day=`ago_day $V_Day $Day`
   while [ $V_Time -le $Change_time ]
   do   
     V_Time=`expr 1440 + $V_Time`  
   done                     
fi
V_Time=`expr $V_Time - $Change_time `
N_Hour=`expr $V_Time / 60 `
N_Hour=`printf "%02d\n" $N_Hour`
N_Min=`expr $V_Time % 60 `
N_Min=`printf "%02d\n" $N_Min`

echo "the $Change_time minute ago is $V_Day $N_HourN_Min "

作者: hail    时间: 2007-09-06 11:05
date
20070906  10:59:20
./test.sh 100
the 100 minute ago is 20070906 09:19
./test.sh 1000
the 1000 minute ago is 20070906 18:19
./test.sh 10000
the 10000 minute ago is 20070831 12:19
./test.sh 1440
the 1440 minute ago is 20070905 10:59
作者: ifIam    时间: 2007-09-19 16:06
首先,非常感谢楼主~
其次,发现一个bug。

>date
Wed Sep 19 00:58:44 PDT 2007
>./test.sh 60
the 60 minute ago is 20070919 23:58

要是都完美了,楼主可是帮了大忙了~~~

thanks again
作者: jyl980431    时间: 2007-12-04 17:49
发现bug
$date +"%Y.%m.%d %T"
2007.12.04 17:46:24
$./test.sh 1100
the 1100 minute ago is 20071204 23:26
作者: springwind426    时间: 2007-12-04 19:27
也不知道是否有perl,如果有的话,可以这么做

  1. perl -e '
  2. ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=gmtime(time-分钟数*60);
  3. printf "%02d-%02d-%02d %02d:%02d:%02d UTC\n",$year+1900,$mon+1,$mday,$hour,$min,$sed;
  4. '
复制代码

作者: walkerxk    时间: 2007-12-05 10:14
一般perl都有的吧,用perl很简单的,虽然学perl很难。
作者: springwind426    时间: 2007-12-05 14:51

  1. #!/usr/bin/sh
  2. var1=$1
  3. S1=`expr 60 \* $1`
  4. dstr=`date -u +'%Y %m %j %H %M %S'|sed 's/ 0/ /g'`
  5. read Y m d H M S <<EOF
  6. $dstr
  7. EOF

  8. d1=`expr $S1 / 86400`
  9. S1=`expr $S1 % 86400`
  10. S=`expr $H \* 3600 + $M \* 60 + $S`
  11. [ $S -lt $S1 ] && d=`expr $d - 1` && S=`expr $S + 86400`   
  12. S=`expr $S - $S1`
  13. H=`expr $S / 3600`
  14. M=`expr $S % 3600 / 60`
  15. S=`expr $S % 60`

  16. d=`expr $d - $d1`
  17. while [ $d -le 0 ];do
  18.         Y=`expr $Y - 1`
  19.         [ `expr $Y % 4` -eq 0 ] && d=`expr $d + 1`
  20.         d=`expr $d + 365`
  21. done

  22. set -- 31 28 31 30 31 30 31 31 30 31 30 31
  23. [ `expr $Y % 4` -eq 0 ] && set -- 31 29 31 30 31 30 31 31 30 31 30 31

  24. m=1
  25. while [ $m -lt 13 ];do
  26.         [ $d -le $1 ] && break
  27.         d=`expr $d - $1`
  28.         m=`expr $m + 1`
  29.         shift
  30. done

  31. printf "%d Minutes ago is:%d-%02d-%02d %02d:%02d:%02d GMT\n" $var1 $Y $m $d $H $M $S
复制代码


修正错误:原来把S=`expr $S + 86400`  写成  S=`expr $S + 3600` 了

[ 本帖最后由 springwind426 于 2007-12-5 16:17 编辑 ]
作者: ly5066113    时间: 2007-12-05 15:20
$ date "+%Y-%m-%d %H:%M:%S"
2007-12-05 15:36:14
$ test.sh 10000
10000 Minutes ago is:2007-11-28 -14:-3:-41 GMT
作者: 寂寞烈火    时间: 2007-12-05 15:54
学习....
作者: freebug    时间: 2014-03-22 23:50
# date "+%Y-%m-%d %H:%M:%S"
2014-03-22 23:49:34
# ./s3.sh 10
10 Minutes ago is:2014-03-23 04:39:44 GMT

为什么会这样?时区的问题么??




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2