1. 程式人生 > >2017.10.10 shell中的日期問題

2017.10.10 shell中的日期問題


shell中的日期問題,要徹底弄清楚。寫一個測試指令碼test.sh

首先是單引號 雙引號的問題。

單引號將變數和特殊字元括起來將失去原有的意義,而只作為普通字元解釋。雙引號括起來後特殊字元將保持原有的意義,其餘的作為普通字元解釋。

#!/bin/sh
. ~/.bash_profile
source /etc/profile

current_day=date +%Y%m%d 無符號
echo "current_day:$current_day"

測試結果為 current_day:

current_day=`date +%Y%m%d`單引號(tab上的單引號)

測試結果為 current_day:date +%Y%m%d

current_day=“date +%Y%m%d" 雙引號

測試結果為 current_day:date +%Y%m%d

current_day=“`date +%Y%m%d`" 外雙內單  (這裡把雙引號去掉也可以!!!!!)

測試結果為 current_day:20171010


兩天後=`date -d "2 day"`

測試結果為 兩天後:2017年 10月 12日 星期四 10:43:22 CST (如果不加+%Y%m%d,則會顯示兩天後此時此刻的全部日期資訊,包括時分秒)

(這裡說明day是特殊字元,用雙引號括起來也保持其特殊意義。)

兩天後=`date +%Y%m%d -d "2 day"`

測試結果為 兩天後:20171012


兩天前=`date +%Y%m%d -d "2 day ago"`

測試結果為 兩天前:20171008     (這裡說明ago是特殊字元有特殊意義,用雙引號括起來也保持其特殊意義。)


last_month=`date -d "1 month ago"` 獲取一個月以前的當前時間
測試結果為 last_month:2017年 09月 10日 星期日 11:00:34 CST

始終都要保持外面有個單引號 這樣啊   混蛋!


普及完基礎知識,來電高階點的


求昨天的日期


如果現在的時間是20180101,那 1 day ago這種寫法還行得通嗎?

有一個思路就是

正確的做法應該是在指令碼一開始就取得當前的時間戳, 然後, 在整個指令碼中, 始終使用這個時間戳來做為當前時間, 這才能保證, 在整個指令碼的執行期間, 你得到的結果,都是你想要的, 而不管你是在午夜,還是大早上的執行你的指令碼.  關於時間的計算, 最好是以"秒"為最小單位, 這樣, 不僅可以保證你得到精確的時間, 還能保證你躲過什麼1號, 或者年底, 或者閏年, 之類的麻煩.我今天實測的

current_time="`date +%s`"
echo "current_time:$current_time"

current_day=`date +%Y%m%d -d @$current_time`
echo "current_day:$current_day"

yesterday=`date +%Y%m%d -d @$((current_time-86400))`
echo "yesterday:$yesterday"

求上個月

#坑01 
#2016年當month為01的時候,上年月份為2015-12
#2016年當month為12的時候,下年月份為2017-01
#2016年當month為其餘月份時候,月份加1或者減一
year=`date -d "0 month ago" +%Y`

month=`date -d "0 month ago" +%m`

nowdate=`date -d "0 month ago" +%Y-%m`

one='01'
if [ $month == $one ]
then
echo "當month為01的時候,上年月份為2015-12"
LastYear=$[$year-1]
Lastdate=$LastYear-12
Nextdate=$year-0$[$month+1] 
echo $Lastdate
echo $nowdate
echo $Nextdate
fi

twelve='12'
if [ $month == $twelve ]
then
echo "當month為12的時候,下年月份為2017-01"
NextYear=$[$year+1]
Lastdate=$year-$[$month-1]
Nextdate=$NextYear-01
echo $Lastdate
echo $nowdate
echo $Nextdate
fi

還有一種情況是

在大部分情況下這個命令執行正確。但是有些情況下這個命令會出現問題,比如當前日期是3月30、3月31、5月31等的時候,上面的命令得到的結果還是當月,而不是我們期望的上月。
這個問題是怎麼產生的呢?比如噹噹前日期是5月31時,-1 month它只是將月份-1,就得到4月31,但是實際上4月只有30天,所以4月31就被轉為5月1號,導致得到的結果還是當前月份。
為了解決這個問題,可以這麼寫(先轉到當月1號的日期再減):
date +%Y%m -d "`date +%Y%m`01 -1 month"