免费注册 查看新帖 |

Chinaunix

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

俺写了几个关于日期的小函数  关闭 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-01-28 18:53 |只看该作者 |正序浏览
有些是以前的,有些没有判断输入合法性,有问题请指正

#计算某日前若干天的日期
#date=YYYYMMDD
#Usage:command date days
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


#计算某日后若干天日期
#date=YYYYMMDD
#Usage:command date days
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`
days=`expr $days + $dd`
while [ $days -gt 0 ]
do
        aaa=`cal $mm $yy`
        bbb=`echo $aaa|awk '{print $NF}'`
        sav_dd=$days
        sav_mm=$mm
        sav_yy=$yy
        days=`expr $days - $bbb`
        mm=`expr $mm + 1`
        [ $mm -gt 12 ] && mm=1 && yy=`expr $yy + 1`
done
expr $sav_dd : "^.$" > /dev/null && sav_dd=0$sav_dd
expr $sav_mm : "^.$" > /dev/null && sav_mm=0$sav_mm
echo $yy$sav_mm$sav_dd
~                 
感觉上面两个挺实用的

#计算前一天日期
aaa=`echo $TZ|sed 's/.*\(..\)/\1/'`
aaa=`expr $aaa + 24`
eval aaa=`echo $TZ|sed 's/..$/+$aaa/'`
TZ=$aaa
export TZ
yy=`date +%y`
mm=`date +%m`
dd=`date +%d`
echo $mm$dd$yy

可以调用上面的函数推导出.

#取上月末日期
get_lastday_of_lastmonth()
{
yy=`date +%Y`
mm=`date +%m-1|bc`
[ $mm -lt 1 ] && mm=12;yy=`expr $yy - 1`
aaa=`cal $mm $yy`
dd=`echo $aaa|awk '{print $NF}'`
echo $yy$mm$dd
}
~     

#计算两个日期间有多少天
#date1,date2:yyyymmdd
#Usage:command date1 date2
str=$1
yy1=`echo $str|cut -c 1-4`
mm1=`echo $str|cut -c 5-6`
dd1=`echo $str|cut -c 7-8`
str=$2
yy2=`echo $str|cut -c 1-4`
mm2=`echo $str|cut -c 5-6`
dd2=`echo $str|cut -c 7-8`
count_day=`expr $dd2 - $dd1`
while [ $yy2 -ne $yy1 -o $mm2 -ne $mm1 ]
do
        mm2=`expr $mm2 - 1`
        [ $mm2 -eq 0 ] && mm2=12 && yy2=`expr $yy2 - 1`
        aaa=`cal $mm2 $yy2`
        bbb=`echo $aaa|awk '{print $NF}'`
        count_day=`expr $count_day + $bbb`
done
echo $count_day

论坛徽章:
0
46 [报告]
发表于 2008-03-05 10:23 |只看该作者
确实实用啊,好东西~!

论坛徽章:
0
45 [报告]
发表于 2008-03-04 17:41 |只看该作者
#计算某日后若干天日期
#修改下原来的
[ $mm -gt 12 ]  && mm=1 && yy=`expr $yy + 1`
#修改为
[ $mm -gt 12 ] && [ $sav_dd -gt 31 ] && mm=1 && yy=`expr $yy + 1`
这样解决了过了一年后的问题

论坛徽章:
0
44 [报告]
发表于 2008-01-30 16:29 |只看该作者

回复 #41 yunzhongyue 的帖子

这样也可以实现, 也是借助date命令

#!/bin/sh

day=$1
interval=`expr $2 \* 60 \* 60 \* 24`

daysec=`date -d $day +%s`
resultsec=`expr $daysec + $interval`

result=`date -d "1970-01-01 UTC $resultsec sec" +%Y%m%d`

echo "result: $result"


运行结果:
#./getDateByInterval.sh 20080101 7
result: 20080108
# ./getDateByInterval.sh 20080101 -7
result: 20071225

论坛徽章:
0
43 [报告]
发表于 2008-01-30 11:54 |只看该作者

回复 #1 nkliyong 的帖子

#计算某日后若干天日期
应该先判断days是否大于0,如果大于0,才应该执行mm=`expr $mm + 1`

[ $days -gt 0 ] && mm=`expr $mm + 1`

论坛徽章:
0
42 [报告]
发表于 2008-01-18 13:49 |只看该作者
原帖由 yunzhongyue 于 2007-11-8 14:08 发表
不如用date


#!/bin/bash
#计算010101 5日后
date -d "010101  5 days" "+%Y%m%d"
#计算010101 5日前
date -d "010101 5 days ago" "+%Y%m%d"
#计算前一天
date -d "last day" "+%Y%m%d"
#计算上个月 ...



版主是什么意思? 不知道为何我运行不了你的这些命令。

怎么计算当前时间5天后的日期,用一条命令能实现吗?

论坛徽章:
1
15-16赛季CBA联赛之江苏
日期:2017-04-05 11:23:15
41 [报告]
发表于 2007-11-08 14:08 |只看该作者
不如用date


#!/bin/bash
#计算010101 5日后
date -d "010101  5 days" "+%Y%m%d"
#计算010101 5日前
date -d "010101 5 days ago" "+%Y%m%d"
#计算前一天
date -d "last day" "+%Y%m%d"
#计算上个月末
date -d "$(date '+%Y%m01') 1 days ago" "+%Y%m%d"
#计算两个日期间有多少天数
echo $(($(($(date -d "020202" "+%s")-$(date -d "010101" "+%s")))/$((60*60*24))))


就是最后一个有点麻烦!

[ 本帖最后由 yunzhongyue 于 2007-11-8 14:36 编辑 ]

论坛徽章:
0
40 [报告]
发表于 2007-11-08 00:18 |只看该作者
原帖由 nkliyong 于 2003-1-28 18:53 发表
有些是以前的,有些没有判断输入合法性,有问题请指正

#计算某日前若干天的日期
#date=YYYYMMDD
#Usage:command date days
str=$1
days=$2
yy=`echo $str|cut -c 1-4`
mm=`echo $str|cut -c 5-6`
dd=`e ...

  1. #!/bin/sh
  2. bg=$1
  3. ed=$2

  4. old=$(date '+%Y%m%d %H:%M:%S')

  5. date -s $1 > /dev/null

  6. date -d "+$2 days" '+%Y%m%d'

  7. date -s "`echo $old`" > /dev/null
复制代码


这样不知道可否…… 不知道有什么问题
除了会导致系统时间有点时间差外:wink:

[ 本帖最后由 boyhyc 于 2007-11-8 21:17 编辑 ]

论坛徽章:
0
39 [报告]
发表于 2007-11-04 23:19 |只看该作者
我是楼主的fans

论坛徽章:
0
38 [报告]
发表于 2005-12-31 11:15 |只看该作者
不错!
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP