因為有個Bash腳本,想根據使用者給的日期參數(yyyymmdd格式),得到這個日期的前一天的表示。首先想到的就是date指令,網上搜了一大把,其實多數都是互相抄的,date基本用法原本就會,不能用來解決我的問題。
先說不用date指令的方法:
不嫌麻煩就多用幾個判斷,解決每月開頭、每年開頭減去一天的問題,最麻煩的是倒推到上個月最後一天,這一天究竟是28、29還是30、31,還得寫個函數。
再說date的基本用法:
date +%Y%m%d 這是格式化輸出,其他語言多數叫做strftime()
date -d "2 days ago" +%s -d可以輸入一個日期,不過大多是相對于現在時間,+%s是輸出時間戳。
date -d "2010-12-06" +%F -d可以接受ISO格式yyyy-mm-ddTHH:MM:SSZ,也可以接受日期的一些英文格式(月份英文縮寫) %F就是%Y%m%d
接着搜到的我不知道的格式用法,當然對我的問題沒有幫助:
格式字元中加-可以去掉前面的0,加_把前面的0變成一個空格,舉例:date +%-Y%-m%-d 是 2010-12-6 (6前面的0去掉了) date +%_Y%_m%_d 是 2010-12- 6 (6前面有一個空格)
最後是謎底,date可以接受的特殊-d參數:
date -d "1970-01-01 UTC 1291622912 seconds" +%s 在前面的日期上面加上這麼多秒作為輸入。在我的腳本中這麼用的:
date=$1 #從腳本的第一個參數得到輸入日期(格式yyyy-mm-dd或者yyyymmdd)
datets=`date -d "$1" +%s` #求出這個日期的時間戳,注意兩邊的是反引号,Tab鍵上面那個,下同
yesterts=`expr $datets - 86400` #往前推一天
yesterday=`date -d "1970-01-01 UTC $yesterts seconds" +%Y%m%d` #把它變做輸出
我從那裡知道的,既不是date的help指令,也不是man文檔。而是一個網頁 [網址找不着了]