shell指令碼判斷某一天是否是當月的最後乙個周四
最近遇到了這樣的乙個需求,要求在每個月的最後乙個周四加三天來執行乙個固定的指令碼,於是就因為判斷最後乙個周四用了很久,在此記錄一下。
整體的思路如下:
將當前的日期減去三天後,得到三天前的日期,判斷得到的三天前的日期是否是該日期所在月的最後乙個周四。
具體的實現
先建立一些變數以供後續的使用
//表示三天前的日期所在的年:2018
year=
$(date -d "-3 day"+%
y)//表示三天前的日期所在的月:11
month=
$(date -d "-3 day"
+%m)
//表示三天前的日期所在的日:27
day=
$(date -d "-3 day"
+%d)
//表示三天前的日期是星期幾
week=
$(date -d "-3 day"
+%u)
//表示三天前的日期年月日形式:20181127
daytime=
$(date -d "-3 day"+%
y%m%d)
//表示三天前的日期的年月表示形式:201811
month1=$
//三天前所在的月的最後一天
monthendday=$
$(cal $ $
|perl -
0nle 'print+(split)[-1]'
)//最後一天是週幾
lastday_week=
$(day -d $
+%u)
準備工作 完成,現在開始進行判斷。我的判斷思路是這樣的,先找出來指定日期坐在月的最後一周,然後判斷該日期是否在最後一周內,如果在的話,再判斷是否是周四。
但是這樣的就存在乙個問題,如果這個月的最後一天恰好是周一,那麼取最後一周的資料時,只能取到周一,將無法找到最後乙個周四,遇到這種情況就需要取出最後兩周。因此需要分兩種情況實現:
這個月的最後一天大於等於周四,就取最後一周進行比較。
這個月的最後一天小於周四,就取這個月的最後兩天進行比較。
//判斷該月的最後一天的星期數是否大於4
if[ $lastday_week -ge 4
];then
//取最後一周的所有日期,例如2023年11的最後一周是26 27 28 29 30,-m表示周一是一周的開始
lastweek=
$(cal -m "$month"
"$year"
| sed '/^$/d'
| tail -1)
//判斷指定的日期是否在最後一周的範圍內
justd=
$(echo "$"
| grep "$"
| wc -l)
//如果是1,表示在該範圍內,是0表示不在
if[ $
-eq 1
];then
//如果是最後一周,判斷只當日期是否是周四
if[ $
-eq 4
];then
sh lastthursday.sh
fifi
else
//取當月的最後兩周
lastweek=
$(cal -m "$month"
"$year"
| sed '/^$/d'
| tail -2)
justd=
$(echo "$"
| grep "$"
| wc -l)
if[ $
-eq 1
];then
if[ $-eq 4
];then
sh lastthursday.sh
fifi
fi
至此,該需求完成。 判斷某一天是這一年的第多少天
先判斷是否是閏年 def leap year year 判斷是否為閏年 return year 4 0 and year 100 0 or year 100 0再計算天數 def day of year year,month,day 計算傳入的日期是這一年的第多少天 days of month 31...
求某一天是星期幾
蔡勒 zeller 公式 歷史上的某一天是星期幾?未來的某一天是星期幾?關於這個問題,有很多計算公式 兩個通用計算公式和一些分段計算公式 其中最著名的是蔡勒 zeller 公式。即w y y 4 c 4 2c 26 m 1 10 d 1 公式中的符號含義如下,w 星期 c 世紀 1 y 年 兩位數 ...
求某一天是星期幾(模板)
題目描述 編一程式實現 由輸入 年以後的任意乙個日期後,計算機能列印出該日期是星期幾。日期肯定合法,絕不會出現類似 年 月 日的情況 已知 年 月 日是星期二。輸入 年 月 日 日期有3個整數組成,中間用空格隔開 輸出 乙個整數星期 星期用1 2 3 4 5 6 7表示 若是星期日就輸出7 樣例 輸...