有没有办法在unix中从一个日期或至少30天减去一个月。
示例:
[yyy-mm-dd] - 30天
2011-07-23 - 30天
顺便说一句,日期可以是任何日期,具体取决于用户输入。
感谢。
答案 0 :(得分:3)
对于任意日期,
$ 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日期,您可以回退到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
答案 1 :(得分:3)
没有既简单又便携的方式,到目前为止所有其他回复都使用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
)
答案 2 :(得分:2)
试试这个
<强> date -d "30 days ago" "+%Y%m%d00"
强>
答案 3 :(得分: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