unix中有沒有辦法從特定日期減去一個月或至少30天?此日期由使用者輸入。
例子:
2012-11-19 - 1 個月 = 2013-10-19
這個不起作用:
date -d '2013-10-13 - 1 month' '+%F'
答案1
最簡單的方法是將日期轉換為 unix time_t 值(即自紀元開始以來的秒數,或「1-1-1970 00:00:00」),然後從中減去 30 天 * 每天 86400 秒數字。
例如,下面的範例使用set -x
以便您可以看到 D 變數的值發生變化。
#! /bin/ksh
set -x
D=$(date -d '2013-10-13' '+%s')
D=$((D - 30 * 86400))
date -d "@$D"
請注意,這取決於date
GNU Coreutils 中的 GNU 版本。其他版本的日期可能不支援將 time_t 值轉換回帶有@
.除非您已經安裝了 GNU coreutils,否則這可能在您的 AIX 系統上不可用,因此gawk
可能是轉換回格式化日期的最佳選擇:
echo "$D" | gawk '{print strftime("%c", $0)}'
我最初的答案建議使用普通的 awk,但在我的 debian 系統上進行的進一步測試表明,既沒有mawk
也original-awk
沒有strftime
內建該函數,因此您必須安裝 GNU Coreutils 或 GNU Awk。
如果系統上安裝了 perl,則可以使用 perl 來取代 awk:
echo $D | perl -nE 'say scalar gmtime $_'
有幾種替代方法和範例可以在以下位置執行此操作:
https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line
答案2
嘗試這個:
date --date="$(date -d "Nov 1 2012")-1 month" +'%Y:%m:%d'
2012:10:01
2012 年 11 月 1 日用於說明。這可以是任何使用者輸入的日期。
答案3
您的範例在日期字串中使用相對項目,這些項目是 GNU 日期擴充。
例如,在 Fedora 19 上,您的範例按預期工作:
$ date -d '2013-10-13 - 1 month' '+%F'
2013-09-13
因此,您可以確保您的腳本使用 GNU 日期。
答案4
嘗試這個。
DAY30=`TZ=EST+720 date "+%Y-%m-%d"`
print $DAY30
720 是以小時為單位的偏移量。所以,30 天就是 720 小時。
EST 是我的時區。我假設您可以使用任何合適的時區。