Answers:
使用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
TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '1 day ago'。您收到错误消息,因为那里没有2011-12-30。也就是说,日期偏移是在日历时间上完成的。2011-12-31减去31天将为您提供2011-11-30,因为它使31减少31。当前时间不减少31 * 24 * 60 * 60 * 60秒。与TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '24 hour ago'此相比,第29天,即这次,它是24 * 60 * 60 * 60秒前的日期。
这是在Mac OS上使用BSD date实用程序的版本:
date -v1d -v-1d +%d%b%Y
参数按顺序应用。您可以想象一下,日期是从一个参数传递到下一个参数的。例如:
date)-> 2017-03-06-v1d)-> 2017-03-01-v-1d)-> 2017-02-28+%d%b%Y)-> 2017年2月28日您可以使用来达到任意数量的前进或后退月份date -v-1m -v1d -v-1d,而用所需的前进或后退-1m月份数(+1m)代替。
这就是通用答案。该问题专门询问有关开始日期的日期。Mac OS / BSD日期实用程序不允许您提供起始日期戳,但可以单独设置每个日期元素:
date -v2015y -v1m -v15d -v1d -v-1d +%d%b%Y -> 2014年12月31日