歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> shell計算明天和昨天日期的函數

shell計算明天和昨天日期的函數

日期:2017/2/27 14:15:27   编辑:SHELL編程
  #返回月份的天數 get_mon_days() { Y=`eXPr substr $1 1 4` M=`expr substr $1 5 2` r1=`expr $Y \% 4` r2=`expr $Y \% 100` r3=`expr $Y \% 400` case $M in 01030507081012) days=31;; 04060911) days=30;; esac if [ $M -eq 02 ] then if [ r1 -eq 0 -a r2 -ne 0 -o r3 -eq 0 ] then days=29 else days=28 fi fi echo $days } #返回昨天日期 get_before_date() { Y=`expr substr $1 1 4` M=`expr substr $1 5 2` D=`expr substr $1 7 2` YY=`expr $Y - 1` MM=`expr $M - 1` DD=`expr $D - 1` MM=`printf "%02d" $MM` DD=`printf "%02d" $DD` dd=$Y$MM dad=`get_mon_days $dd` be_date=$Y$M$DD if [ $D -eq 01 ] then if [ $M -ne 01 ] then be_date=$Y$MM$dad fi if [ $M -eq 01 ] then be_date=$YY"1231" fi fi echo $be_date } #返回明天日期 get_next_date() { Y=`expr substr $1 1 4` M=`expr substr $1 5 2` D=`expr substr $1 7 2` YY=`expr $Y + 1` MM=`expr $M + 1` DD=`expr $D + 1` MM=`printf "%02d" $MM` DD=`printf "%02d" $DD` r1=`expr $Y \% 4` r2=`expr $Y \% 100` r3=`expr $Y \% 400` next_date=$Y$M$DD if [ $D -eq 30 ] then case $M in 04060911) next_date=$Y$MM"01";; esac fi if [ $D -eq 31 ] then next_date=$Y$MM"01" case $M in 12) next_date=$YY"0101";; esac fi if [ $M -eq 02 ] then if [ r1 -eq 0 -a r2 -ne 0 -o r3 -eq 0 ] then if [ $D -eq 29 ] then next_date=$Y$MM"01" fi else if [ $D -eq 28 ] then next_date=$Y$MM"01" fi fi fi echo $next_date } 本人在HP Unix下測試通過 不錯. 不過,用改變時區的方法,得到的結果不是又簡單,又准確嗎? 版主時區變換法是什麼? 比如說,想這樣: 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/` date +%D 請問能不能解釋一下這三句話的含義呀? 我第二句執行不過! 第二句是`不是',是不是輸錯了. 我是copy, paste 上的! root/export >offset=`echo $TZ tr -d '[A-Z+]'` root/export >echo $offset GMT8 root/export >new_offset=`expr $offset - 24 ` expr: non-numeric argument tr -d '[A-Z+] offset 裡怎麼還會有GMT呢? 有GMT expr當然不認了. 是呀! 第一句有什麼問題呀???? 你是什麼系統啊,什麼版本的tr啊. 俺都試過的啊. valentine,能不能解釋一下這幾句,3x! #offset=`echo $TZ tr -d '[A-Z+]'` #使用tr刪除變量中的大寫字符和+號,只保留數字 new_offset=`expr $offset - 24 ` #改變數字,因為TZ變量中的數字反映的是本地相對與GMT的偏移 TZ=`echo $TZ sed "s/[+-]{0,1}[1-9][0-9]{0,1}/$new_offset/` date +%D #使用算出來的偏移構造新的TZ變量,這裡使用了正則表達式裡稍復雜點的東西 #主要是{0,1},表示前面的字符或子表達式出現的次數最小0次,最多1次. 為什麼我的$TZ只是大寫字符,沒有數值? 我用的是s8操作系統 那樣作法是不對的:20020930+1=? 20021001-1=? #echo $TZ CST-8 換一部機器: #echo $TZ EST5EDT 奇怪! 有什麼奇怪的,那兩台機子的時區不一樣啊!



我用的是s8操作系統 那樣作法是不對的:20020930+1=? 20021001-1=? #echo $TZ CST-8 換一部機器: #echo $TZ EST5EDT 奇怪! 有什麼奇怪的,那兩台機子的時區不一樣啊!



Copyright © Linux教程網 All Rights Reserved