【问题标题】:YYYY-MM-DD format date in shell scriptshell脚本中的YYYY-MM-DD格式日期
【发布时间】:2010-11-26 22:52:46
【问题描述】:

我尝试在我的 bash shell 脚本中使用$(date),但是,我想要YYYY-MM-DD 格式的日期。
我如何得到这个?

【问题讨论】:

  • 评论的长度必须至少为 15 个字。日期-I
  • 确实 date -I 是您所需要的。我花了好几年才偶然发现这一点。
  • date -I 仅适用于使用 GNU 工具的 Linux,不适用于 macOS / BSD;安装brew --> brew install coreutils 使gdate -I 可用

标签: bash shell date strftime


【解决方案1】:

你可以这样做:

$ date +'%Y-%m-%d'

【讨论】:

    【解决方案2】:

    在 bash (>=4.2) 中,最好使用 printf 的内置日期格式化程序(bash 的一部分)而不是外部的 date(通常是 GNU 日期)。

    这样:

    # put current date as yyyy-mm-dd in $date
    # -1 -> explicit current date, bash >=4.3 defaults to current time if not provided
    # -2 -> start time for shell
    printf -v date '%(%Y-%m-%d)T\n' -1 
    
    # put current date as yyyy-mm-dd HH:MM:SS in $date
    printf -v date '%(%Y-%m-%d %H:%M:%S)T\n' -1 
    
    # to print directly remove -v flag, as such:
    printf '%(%Y-%m-%d)T\n' -1
    # -> current date printed to terminal
    

    在 bash (

    # put current date as yyyy-mm-dd in $date
    date=$(date '+%Y-%m-%d')
    
    # put current date as yyyy-mm-dd HH:MM:SS in $date
    date=$(date '+%Y-%m-%d %H:%M:%S')
    
    # print current date directly
    echo $(date '+%Y-%m-%d')
    

    其他可用的日期格式可以从date man pages查看(对于外部非bash特定的命令):

    man date
    

    【讨论】:

    • 在本月的第一天,我得到“2012-07-1”,这不是 OP 要求的。
    • 这对我有用。手册页建议该月的第一天是 01,没有 1(例如 2012-07-01)。
    • DATE=$(date +%d-%m-%Y" "%H:%M:%S);我最终的结果。
    • 我还没有检查这些快捷方式的使用范围有多广,但在某些发行版中,您可以使用+%F %T 作为+%Y-%m-%d %H:%M:%S 的快捷方式。请注意,一些文件系统(咳嗽**HFS)会将: 转换为/,给你一个像2016-09-15 11/05/00 这样的字符串,这非常令人困惑。
    • 在这个千年中任何符合 POSIX 标准的 shell 中的首选语法是 date=$(date) 而不是 date=`date`。另外,不要对私有变量使用大写;大写变量名是为系统保留的。
    【解决方案3】:

    试试:$(date +%F)

    %F 选项是%Y-%m-%d 的别名

    【讨论】:

    • 日期的手册页显示:%F full date;与 %Y-%m-%d 相同,因此这只是接受答案的更紧凑的表示法。
    【解决方案4】:

    您正在寻找 ISO 8601 标准日期格式,所以如果您有 GNU 日期(或任何比 1988 年更现代的日期命令),只需执行以下操作:$(date -I)

    【讨论】:

    • 我有一台最近 (>1988) 的 Mac OS X 计算机,而 date -I 无法正常工作。使用brew(使用前缀'g')安装GNU coreutils gdate -I 确实有效。
    • 奇数。我找不到为 GNU date 记录的 -I 选项,尽管它确实似乎等同于 date +%F
    • OS X 通常是 GPL v3 荒地,所以他们可能只是最近没有更新日期或 BASH。
    • 我喜欢这个选项,因为它不需要在 cron 中转义 %
    【解决方案5】:
    date -d '1 hour ago' '+%Y-%m-%d'
    

    输出将是2015-06-14

    【讨论】:

    • 错误有几个原因,显然这给出了 00:00 到 01:00 之间的错误日期,而且你以 % 结尾。
    • 这不是真的。应该是这样的稀疏单引号
    【解决方案6】:

    如果您希望年份采用两位数字格式,例如 17 而不是 2017,请执行以下操作:

    DATE=`date +%d-%m-%y`
    

    【讨论】:

      【解决方案7】:

      对于最近的 Bash(版本 ≥ 4.2),您可以使用带有格式修饰符 %(strftime_format)T 的内置 printf

      $ printf '%(%Y-%m-%d)T\n' -1  # Get YYYY-MM-DD (-1 stands for "current time")
      2017-11-10
      $ printf '%(%F)T\n' -1  # Synonym of the above
      2017-11-10
      $ printf -v date '%(%F)T' -1  # Capture as var $date
      

      printfdate 快得多,因为它是 Bash 内置命令,而 date 是外部命令。

      同样,printf -v date ...date=$(printf ...) 更快,因为它不需要分叉子 shell。

      【讨论】:

      • 作为 2019 年的注释,如果您已经在 bash 脚本中使用此命令,则此命令比 date 快得多*,因为它不必加载任何额外的库。 (* 我在我的 linux 服务器上测量了 1000 次迭代的速度差异约为 160 倍)
      • @timtj 感谢您指出这一点!我在答案中添加了一些关于速度的注释。
      • 我希望我可以 +5 评论 printf -v date 不分叉子外壳。非常好的信息!
      • 通常我使用日期,因为我还需要增加一些日期。 printf 可以做日期算术吗?
      • @Merlin 我不这么认为
      【解决方案8】:
      #!/bin/bash -e
      
      x='2018-01-18 10:00:00'
      a=$(date -d "$x")
      b=$(date -d "$a 10 min" "+%Y-%m-%d %H:%M:%S")
      c=$(date -d "$b 10 min" "+%Y-%m-%d %H:%M:%S")
      #date -d "$a 30 min" "+%Y-%m-%d %H:%M:%S"
      
      echo Entered Date is $x
      echo Second Date is $b
      echo Third Date is $c
      

      这里 x 是使用的示例日期,然后示例显示数据的格式以及比当前日期多 10 分钟的日期。

      【讨论】:

        【解决方案9】:

        每当我有这样的任务时,我最终都会退回到

        $ man strftime
        

        提醒自己时间格式选项的所有可能性。

        【讨论】:

          【解决方案10】:
          $(date +%F)
          

          输出

          2018-06-20
          

          或者如果你也想要时间:

          $(date +%F_%H-%M-%S)
          

          可用于删除中间的冒号 (:)

          输出

          2018-06-20_09-55-58
          

          【讨论】:

          • 感谢额外的时间 - OP 可能没有问过,但我敢肯定大多数谷歌搜索的人都对此感兴趣!
          • %T 也是%H:%M:%S 的有用别名。
          【解决方案11】:

          您可以将日期设置为环境变量,以后您可以使用它

          setenv DATE `date "+%Y-%m-%d"`
          echo "----------- ${DATE} -------------"
          

          DATE =`date "+%Y-%m-%d"`
          echo "----------- ${DATE} -------------"
          

          【讨论】:

            【解决方案12】:

            我使用$(date +"%Y-%m-%d")$(date +"%Y-%m-%d %T") 来表示时间和小时数。

            【讨论】:

              【解决方案13】:

              我使用以下公式:

              TODAY=`date -I`
              echo $TODAY
              

              查看date 的手册页,还有许多其他有用的选项:

              man date
              

              【讨论】:

              【解决方案14】:

              尝试使用这个命令:

              date | cut -d " " -f2-4 | tr " " "-" 
              

              输出类似于:21-Feb-2021

              【讨论】:

                猜你喜欢
                • 2016-01-02
                • 1970-01-01
                • 2018-04-13
                • 2016-01-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多