Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date Unix中的减法日期_Date_Unix_Ksh - Fatal编程技术网

Date Unix中的减法日期

Date Unix中的减法日期,date,unix,ksh,Date,Unix,Ksh,是否有一种方法可以从一个日期中减去一个月,或者在unix中至少减去30天 例如: [yyy-mm-dd]-30天 2011-07-23-30天 顺便说一下,日期可以是任何日期,具体取决于用户输入 谢谢。试试这个 日期-d“30天前”+%Y%m%d00“对于任意日期 $ 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-0

是否有一种方法可以从一个日期中减去一个月,或者在unix中至少减去30天

例如:

[yyy-mm-dd]-30天

2011-07-23-30天

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

谢谢。

试试这个


日期-d“30天前”+%Y%m%d00“
对于任意日期

$ 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日期


如果没有GNUdate,您可以回到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
在终端中键入“info coreutils date invocation”,了解更多信息。 第28.7节:日期字符串中的相关项文件:coreutils.info

编辑:希望用户输入日期

#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

没有一种既简单又可移植的方法,到目前为止,所有其他回复都使用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
)

日期:未识别标志:d用法:日期[-u][+“字段描述符”]您的操作系统是什么?你有什么版本的perl?我的操作系统是AIX,perl的版本是Perl5,版本12这很好。然而,对我来说,GNU核心实用程序有很多更好的方法,我已经决定在我工作的任何地方安装GNU UTIL。@merlin确实如此。仍然有少数情况下没有安装GNU工具包,安装它也不是一个选项。
#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
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
)