程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Shell處理日期的函數

Shell處理日期的函數

編輯:關於C語言
 

aaa=`cal $mm $yy`
bbb=`echo $aaa|awk '{print $NF}'`

其實感覺用上面兩句取某月有多少天在計算日期中非常有用
俺也是吸取前人的經驗靈活應用一下.

有些是以前的,有些沒有判斷輸入合法性,有問題請指正

#計算某日前若干天的日期
#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


"計算某日後若干天日期"好象是有點問題,當月份為12月時會出錯,我想可能就是因為沒有去判斷這個月是幾天,然後看是否“-gt”那個天數。
哪怕是算12月1日的後一天,mm也會加1。

---------------------------------
感謝,偶出新大意拉.應該這樣

#計算某日後若干天日期
#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 $sav_yy$sav_mm$sav_dd

--------------------------------------------------------最簡單的。。。

版主---

不如用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))))


就是最後一個有點麻煩!

-----------------------------------------------------

回復 #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

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved