在unix中減去日期

在unix中減去日期

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"

請注意,這取決於dateGNU Coreutils 中的 GNU 版本。其他版本的日期可能不支援將 time_t 值轉換回帶有@.除非您已經安裝了 GNU coreutils,否則這可能在您的 AIX 系統上不可用,因此gawk可能是轉換回格式化日期的最佳選擇:

echo "$D" | gawk '{print strftime("%c", $0)}'

我最初的答案建議使用普通的 awk,但在我的 debian 系統上進行的進一步測試表明,既沒有mawkoriginal-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 是我的時區。我假設您可以使用任何合適的時區。

相關內容