Date

date 命令中的“1 個月前”選項如何工作?

  • February 20, 2019

我不確定這是否會在當天獲得過去的日期,或者是否只需要 30 或 31 天。

例如

如果目前日期是March 28th1 個月前,則必須是 1 個月前February 28th,但是什麼時候會發生呢March 30th

設想

我想每天備份一些文件,腳本會將這些文件保存在目前日期內,$(date +%Y%m%d)格式為,比如20150603_bckp.tar.gz,然後當下個月到來時,刪除 1 個月前的所有文件,除了 1 號和 15 號的文件,所以這是我的條件:

past_month = $(date -d "-1 month" +%Y%m%d)
day = $(date +%d)
if [ "$day" != 01 ] && [ "$day" != 15 ]
then
   rm /path/of/files/${past_month}_bckp.tar.gz
   echo "Depuration done"
else
   echo "Keep file"
fi

但我想知道,當日期是 30 日、31 日甚至是過去的 2 月範例時會發生什麼?它會保留那些文件嗎?或刪除第一天的文件?

到 31 號時會執行清除,所以如果過去一個月只有 30 天,這會刪除第 1 天的文件嗎?

我希望我暗示了。

- 1 month將從月份數中減去 1,然後如果生成的日期無效(February 30例如 ),請調整它以使其有效。所以December 31 - 1 monthDecember 1,不是十一月的一天,March 31 - 1 month而是March 3(除非在閏年執行)。

這是來自Gnu資訊頁面的引用date(這是date實現此語法的版本),其中包括一個很好的建議,可以使算法更加健壯:

單位中的模糊可能會導致相關項目出現問題。例如,2003-07-31 -1 month可能計算為 2003-07-01,因為 2003-06-31 是無效日期。為了更可靠地確定上個月,您可以要求當月 15 日之前的月份。例如:

   $ date -R
   Thu, 31 Jul 2003 13:02:39 -0700
   $ date --date='-1 month' +'Last month was %B?'
   Last month was July?
   $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
   Last month was June!

另一個警告,也從資訊頁面引用:

此外,在圍繞時鐘變化(例如夏令時飛躍)操作日期時要小心。在少數情況下,它們會從時鐘中增加或減少多達 24 小時,因此 在開始日曆計算之前通過將TZ環境變數設置為來採用通用時間通常是明智的。UTC0

引用自:https://unix.stackexchange.com/questions/207617