3

有没有办法从日期中减去一个月或在 unix 中至少减去 30 天。

例子:

[yyy-mm-dd] - 30 天

2011-07-23 - 30 天

顺便说一下,日期可以是任何日期,具体取决于用户输入。

谢谢。

4

4 回答 4

5

对于任意日期,

$ date -d "2011-07-23 - 1 month" "+%F"
2011-06-23
$ date -d "2011-07-23 - 30 days" "+%F"
2011-06-23
$ date -d "2011-08-23 - 1 month" "+%F"
2011-07-23
$ date -d "2011-08-23 - 30 days" "+%F"
2011-07-24

这是 GNU 日期


如果没有 GNU date,您可以回退到 perl。Time::Piece 和 Time::Seconds 模块应该在 perl 5.12 中可用

perl -MTime::Piece -MTime::Seconds -e '
    print "date\t-1 month\t-30 days\n";
    while (@ARGV) {
        my $t = Time::Piece->strptime(shift, "%Y-%m-%d");
        print $t->ymd, "\t";
        print $t->add_months(-1)->ymd, "\t";
        $t -= 30*ONE_DAY; 
        print $t->ymd, "\n";
    }
' 2011-07-23 2011-08-23
date    -1 month    -30 days
2011-07-23  2011-06-23  2011-06-23
2011-08-23  2011-07-23  2011-07-24
于 2013-10-04T04:00:50.223 回答
4

没有既简单又可移植的方式,到目前为止所有其他回复都使用 Gnu 特定的扩展。

这应该适用于任何 Unix:

date "+%Y %-m %-d" |
(
  read y m d
  m=$(($m - 1))
  [ $m = 0 ] && { m=12; y=$(($y - 1)); }
  [ $d = 31 -a \( $m = 4 -o $m = 6 -o $m = 9 -o $m = 11 \) ] && d=30
  [ $d -gt 28 -a $m = 2 ] && d=28
  printf "%04d:%02d:%02d\n" $y $m $d
)
于 2013-10-04T08:30:24.477 回答
2

尝试这个

date -d "30 days ago" "+%Y%m%d00"

于 2013-10-04T03:48:12.133 回答
0
#Current Date
 date +'%Y:%m:%d'
 2013:10:04

#Date a month ago
 date --date='-1 month' +'%Y:%m:%d. Last month was %B.'
 2013:09:04. Last month was September.
#%B prints out locale's full month name. 

在终端中输入“info coreutils date invocation”并了解更多信息。部分:28.7 日期字符串中的相关项。文件: coreutils.info

编辑:看起来 OP 希望用户输入日期。

#Nov 1 2012 can be  modified to suit user's input. 
 date --date="$(date -d "Nov 1 2012")-1 month" +'%Y:%m:%d'
 2012:10:01
于 2013-10-04T07:48:22.577 回答