【问题标题】:Subtracting Dates in Unix在 Unix 中减去日期
【发布时间】:2013-10-10 22:59:03
【问题描述】:

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

示例:

[yyy-mm-dd] - 30 天

2011-07-23 - 30 天

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

谢谢。

【问题讨论】:

    标签: date unix ksh


    【解决方案1】:

    试试这个

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

    【讨论】:

      【解决方案2】:

      对于任意日期,

      $ 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
      

      【讨论】:

      • 日期:无法识别的标志:d 用法:日期 [-u] [+"字段描述符"]
      • 你的操作系统是什么?你有什么版本的 perl?
      • 我的操作系统是 AIX,我的 perl 版本是 perl 5, version 12
      【解决方案3】:
      #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
      

      【讨论】:

        【解决方案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
        )
        

        【讨论】:

        • 这很好。然而,对我来说,GNU 核心实用程序有很多更好的方法,我决定在我工作的任何地方安装 GNU 实用程序。
        • @merlin 确实如此。在极少数情况下,没有安装 GNU 工具包并且安装它不是一个选项。
        猜你喜欢
        • 2015-06-11
        • 2018-12-01
        • 1970-01-01
        • 2018-10-24
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        • 2021-04-28
        • 2022-01-21
        相关资源
        最近更新 更多