在 shell 脚本中获取上个月最后一天的日期

在 shell 脚本中获取上个月最后一天的日期

如何根据处理日期获取上个月的结束日期?

例子:

  • 处理日期 = 15jan2015
  • 预计日期 = 2014 年 12 月 31 日,

  • 处理日期 = 2015 年 2 月 10 日
  • 预计日期 = 2015 年 1 月 31 日

答案1

使用 GNU date

$ date +%d%b%Y
16Aug2015
$ date -d "$(date +%Y-%m-01) -1 day" +%d%b%Y
31Jul2015

一些 shell 内置了对日期操作的支持:

ksh93

$ printf "%(%d%b%Y)T\n" "1st day, yesterday"
31Jul2015

zsh

$ zmodload zsh/datetime
$ strftime -s d %Y-%m-01-12 $EPOCHSECONDS
$ strftime -rs d %Y-%m-%d-%H $d
$ strftime %d%b%Y $((d-86400))
31Jul2015

答案2

这是一个适用于 Mac OS 的版本,它使用 BSDdate实用程序:

date -v1d -v-1d +%d%b%Y

参数按顺序应用。您可以想象日期是从一个参数传送到下一个参数的。例如:

  • 从当前日期开始 ( date) -> 2017-03-06
  • 将该日期设置为该月的第一天 ( -v1d) -> 2017-03-01
  • 从中减去一天 ( -v-1d)-> 2017-02-28
  • 设置日期格式 ( +%d%b%Y) -> 28Feb2017

您可以使用 向前或向后移动任意月数date -v-1m -v1d -v-1d,并将其替换-1m为您想要的向前或向后移动的月数 ( +1m)。

这是通用答案。该问题专门询问相对于开始日期的日期。 Mac OS / BSD 日期实用程序不允许您提供起始日期戳,但您可以单独设置每个日期元素:

date -v2015y -v1m -v15d -v1d -v-1d +%d%b%Y-> 2014 年 12 月 31 日

答案3

有很多方法去做这个;这是最简单的一个我发现(这里假设 GNU date):

$ date -d "-$(date +%d) days"
Fri Jul 31 16:07:23 EDT 2015

答案4

尝试使用此代码

date -d "-$(date +%d) days  month" +%Y-%m-%d

相关内容